Skip to main content
Ubiquiti airOS Logo

python-airos

An asynchronous Python module to interact with Ubiquiti airOS devices, emulating a web browser client.

Maintenance CodeRabbit.ai is Awesome renovate maintained

PyPI version fury.io Latest release Newest commit

CodeFactor codecov

Quality Gate Status Technical Debt Code Smells

Overview

python-airos or airos from pypi is an asynchronous Python library designed to programmatically interact with Ubiquiti airOS devices. It mimics a web browser client to fetch device status, configuration, and perform actions like kicking connected stations.

This library is a key component for a potential future core integration with Home Assistant, with the initial pull request for core integration targeted for the 2025.8 release.

More details on the integration can be found on the Ubiquiti UISP airOS page. To add airOS directly feel free to use the button below:

Open your Home Assistant instance and show your integrations.

Features

  • Asynchronous Operations: Built with asyncio and aiohttp for non-blocking I/O, which is perfect for integrations and background tasks.
  • Client Emulation: Authenticates and interacts with airOS devices by emulating a client browser, ensuring a high degree of compatibility.
  • Data Retrieval: Fetches comprehensive device status information, including:
  • Wireless mode and signal strength.
  • Connected stations and their statistics.
  • System information and uptime.
  • Device Control: Provides methods to perform actions, such as reconnecting/kicking a connected wireless station and rebooting the device itself.
  • Discovery of airOS devices on your local network (by listening to announcements these devices broadcast).

Installation

You can install python-airos from PyPI using pip:

pip install airos

Usage

Here is a more detailed example of how to use the library to connect, fetch status, and perform an action on an airOS device.

import aiohttp
import asyncio
from airos.airos6 import AirOS6, AirOS6Data
from airos.airos8 import AirOS8, AirOS8Data
from airos.helpers import DetectDeviceData, async_get_firmware_data


async def main():
    """Main function to demonstrate library usage."""
    # Create an aiohttp session with SSL verification disabled.
    # Be cautious with this setting; it's useful for self-signed certificates
    # but not recommended for production environments without proper validation.
    session = aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=False))

    # Connection data
    conn_data = {
        "host": "192.168.1.2",
        "username": "ubnt",
        "password": "password",
        "session": session,
    }

    device_data: DetectDeviceData = await async_get_firmware_data(**conn_data)
    airos_class: type[AirOS8 | AirOS6] = AirOS8
    AirOSDataDetect = AirOS8Data | AirOS6Data

    if device_data["fw_major"] == 6:
        airos_class = AirOS6

    # Initialize the AirOS device object.
    airos_device = airos_class(**conn_data)

    try:
        # Step 1: Login to the device.
        login_result = await airos_device.login()
        print(f"Login successful: {login_result}")

        # Step 2: Fetch the device status.
        status_data = await airos_device.status()
        print("\n--- Device Status ---")
        print(f"Device Name: {status_data.host.hostname}")
        print(f"Wireless Mode: {status_data.wireless.mode}")
        print(f"Firmware Version: {status_data.host.fwversion}")

        # Fetch and display connected stations if available
        if status_data.wireless.sta:
            print("\n--- Connected Stations ---")
            for station in status_data.wireless.sta:
                print(f"  - MAC: {station.mac}")
                print(f"    Signal: {station.signal} dBm")
                print(f"    Uptime: {station.uptime} seconds")

        # Step 3: Perform an action, e.g., kick a station.
        # Replace '01:23:45:67:89:AB' with the MAC address of a station to kick.
        # kick_result = await device.stakick("01:23:45:67:89:AB")
        # print(f"\nKick station result: {kick_result}")

    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        # Ensure the aiohttp session is closed properly.
        await session.close()


if __name__ == "__main__":
    asyncio.run(main())

Supported API classes and calls

Note: For firmware 6 we only support the login and status calls currently.

Classes

  • airos.data (directly) as well as airos.airos8 (indirectly) provides AirOSData, a mashumaro based dataclass
  • airos.discovery provides AirOSDiscoveryProtocol for the actual discovery, we recommend to use the async_discover_devices function for consumption as described below

Calls

  • airos.airos8: initializes with host: str, username: str, password: str, session: aiohttp.ClientSession

    • login(): Authenticates with the device.

    • status(): Fetches a comprehensive dictionary of the device's status and statistics.

    • warnings(): Retrieves warning status dict.

    • stakick(mac_address: str): Disconnects a specific station by its MAC address.

    • reboot(): Reboots the device.

    • provmode(active: bool = False): Enables or disables the provisioning mode.

    • update_check(force: bool = False): Checks if new firmware has been discovered (or force to force check).

    • download(): Starts downloading (not installing) new firmware.

    • progress(): Fetches the firmware download (not install!) progress.

    • install(): Installs the new firmware.

  • airos.discovery

    • async_discover_devices(timeout: int) mainly for consumption by HA's config_flow returning a dict mapping mac-addresses to discovered info.

Information

Update

Will return either {"update": False} or the full information regarding the available update:

{"checksum": "b1bea879a9f518f714ce638172e3a860", "version": "v8.7.19", "security": "", "date": "250811", "url": "https://dl.ubnt.com/firmwares/XC-fw/v8.7.19/WA.v8.7.19.48279.250811.0636.bin", "update": True, "changelog": "https://dl.ubnt.com/firmwares/XC-fw/v8.7.19/changelog.txt"}
Progress

If no progress to report {"progress": -1} otherwise a positive value between 0 and 100.

Install

Only a positive outcome is expected from the user experience; the call should return:

{
    "ok": true,
    "code": 0
}

Warnings

Will respond with something like:

{
    "isDefaultPasswd": false,
    "customScripts": false,
    "isWatchdogReset": 0,
    "label": 0,
    "chAvailable": false,
    "emergReasonCode": -1,
    "firmware": {
        "isThirdParty": false,
        "version": "",
        "uploaded": false
    }
}

Contributing

We welcome contributions as well as additional codeowners to python-airos.

Metadata

Release files for airos 0.6.13

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for airos 0.6.13
File Size Uploaded Provenance Actions
airos-0.6.13.tar.gz 46.9 kB With provenance Details for airos-0.6.13.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for airos 0.6.13
File Interpreter ABI Platform Actions
airos-0.6.13-py3-none-any.whl Python 3 none any Details for airos-0.6.13-py3-none-any.whl

Total release size: 71.2 kB

Release files / airos-0.6.13.tar.gz

Download URL airos-0.6.13.tar.gz
Size 46.9 kB
Tags Source
SHA-256 checksum
How to use checksums
fe05d402c1268a644e444870c8f9282b60f2a1c1631f4b6e1a07e94dddbc03e8
BLAKE2b-256 checksum
How to use checksums
d160d20ce5f83774466ca9c46fc23aec724a75b443284c1ad648f1103ba2a8b1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.

Transparency log

Release files / airos-0.6.13-py3-none-any.whl

Download URL airos-0.6.13-py3-none-any.whl
Size 24.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
df1800b4921312dc67f3e72c14c4043f682b21cf8896a88e3593557385aec804
BLAKE2b-256 checksum
How to use checksums
1e2b8d94f01ab6fb4dba30f24efcc2400f99f41e26936578a0b6ab3bcd64d2e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.

Transparency log

Security for airos 0.6.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for airos-0.6.13.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.6.13 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page