An asynchronous Python module to interact with Ubiquiti airOS devices, emulating a web browser client.
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:
- Asynchronous Operations: Built with
asyncioandaiohttpfor 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.
- Discovery of airOS devices on your local network (by listening to announcements these devices broadcast).
You can install python-airos from PyPI using pip:
pip install airosHere 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.airos8 import AirOS
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))
# Initialize the AirOS device object.
device = AirOS(
host="192.168.1.2",
username="ubnt",
password="password",
session=session
)
try:
# Step 1: Login to the device.
login_result = await device.login()
print(f"Login successful: {login_result}")
# Step 2: Fetch the device status.
status_data = await 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.stations:
print("\n--- Connected Stations ---")
for station in status_data.wireless.stations:
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())airos.data(directly) as well asairos.airos8(indirectly) providesAirOSData, a mashumaro based dataclassairos.discoveryprovidesAirOSDiscoveryProtocolfor the actual discovery, we recommend to use theasync_discover_devicesfunction for consumption as described below
airos.airos8: initializes withhost: str, username: str, password: str, session: aiohttp.ClientSessionlogin(): Authenticates with the device.status(): Fetches a comprehensive dictionary of the device's status and statistics.stakick(mac_address: str): Disconnects a specific station by its MAC address.
airos.discoveryasync_discover_devices(timeout: int)mainly for consumption by HA'sconfig_flowreturning a dict mapping mac-addresses to discovered info.
More features and API calls are planned for future releases.
We welcome contributions as well as additional codeowners to python-airos.