Execute API calls to Omada Controller from python code
Project description
omada-client
Python client for Tp-Link Omada Controller (Omada Software Controller). Allows executing API calls to the Omada Controller from Python code.
Library created for automating and integrating with TP-Link Omada SDN Controllers. Unlike raw HTTP scripts or outdated wrappers, this library provides a clean, typed interface that enables developers and network engineers to manage Omada infrastructure with minimal effort and maximum reliability.
It abstracts away authentication, session handling, CSRF tokens, and endpoint routing, allowing you to focus on logic instead of network plumbing. The library is fully compatible with modern Python environments (>=3.11), supports structured data models via Pydantic, and includes utilities for batching large requests, safely manipulating network routes, and managing connected devices.
Installation
Using python:
pip install omada-client
Quick Start
Using direct credentials
from omada_client import OmadaClient
omada = OmadaClient(
"OMADA_DOMAIN", # URL of Omada WebUI
"OMADA_USER", # Username
"OMADA_PASSWORD", # Password
"SITE_ID" # Site identify (Optional. Default: First site in list)
)
Using environment variables
from dotenv import load_dotenv
import os
from omada_client import OmadaClient
load_dotenv()
omada = OmadaClient(
os.getenv("OMADA_DOMAIN"),
os.getenv("OMADA_USER"),
os.getenv("OMADA_PASSWORD"),
os.getenv("SITE_ID")
)
print(omada.get_devices())
Methods Reference
| Category | Method | Parameters | Description |
|---|---|---|---|
| WAN Ports | get_all_wan_ports() |
None | List all WAN ports |
get_wan_ports_by_name(name) |
name: str |
Get WAN port by name | |
get_wan_ports_by_desc(desc) |
desc: str |
Get WAN port by description | |
| Wireless | get_all_wlan() |
None | List all Wi-Fi networks |
get_wlan_by_ssid(ssid) |
ssid: str |
Get Wi-Fi network by SSID | |
| Static Routes | create_static_route(route_name, destinations, interface_id, next_hop_ip, enable=False, metricId=0) |
route_name: str, destinations: list[str], interface_id: str, next_hop_ip: str |
Create a single static route |
create_static_route_to_inteface_with_big_data(data_static_routes, interface_id, next_hop_ip, enable=False, metricId=0) |
data_static_routes: list, interface_id: str, next_hop_ip: str |
Create static routes from large data | |
| Devices & Clients | get_devices() |
None | List all devices |
get_clients() |
None | List all clients | |
get_client_by_mac(mac) |
mac: str |
Get client by MAC | |
get_client_by_ip(ip_address) |
ip_address: str |
Get client by IP | |
create_group_ip_v4(group_name, ip_v4_list) |
group_name: str, ip_v4_list: list[GroupMemberIpv4Model] |
Create new group IPv4 addresses | |
delete_ipv4_from_group_by_name(group_name, ip_v4) |
group_name: str, ip_v4: GroupMemberIpv4Model |
Remove IPv4 address from group by name | |
| Groups | get_all_groups() |
List all groups | |
get_group_by_id(id) |
id: str |
Get group port by ID | |
get_group_by_name(name) |
name: str |
Get group port by Name | |
| IP Assignment | set_client_fixed_address_by_mac(mac, ip_address=None) |
mac: str, ip_address: str |
Assign fixed IP by MAC |
set_client_fixed_address_by_ip(ip_address) |
ip_address: str |
Assign fixed IP by IP | |
set_client_dymanic_address_by_mac(mac) |
mac: str |
Assign dynamic IP by MAC |
Advanced Example
Create static routes from large data sets
from dotenv import load_dotenv
import os
from omada_client import OmadaClient
load_dotenv()
omada = OmadaClient(
os.getenv("OMADA_DOMAIN"),
os.getenv("OMADA_USER"),
os.getenv("OMADA_PASSWORD")
)
data = [
{"name": "group_1", "ips": "99.99.99.99/24, 88.88.88.88/24"},
{"name": "group_2", "ips": "99.99.99.99/24, 88.88.88.88/24"}
]
wan = omada.get_wan_ports_by_desc("openwrt")
omada.create_static_route_to_inteface_with_big_data(
data_static_routes=data,
interface_id=wan.port_uuid,
next_hop_ip=wan.wan_port_ipv4_setting.get("ipv4Static").get("gateway"),
enable=False
)
Notes
- Replace all IPs, MAC addresses, and credentials with real values.
- Environment variables help keep sensitive credentials out of code.
- Use badges above to quickly check test status and PyPI version.
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 omada_client-1.2.22.tar.gz.
File metadata
- Download URL: omada_client-1.2.22.tar.gz
- Upload date:
- Size: 12.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7aec4219ab97d4fc35baf57489e177bf50da463d77fe45bedd7113acfce0c129
|
|
| MD5 |
72878c59856fae9324b1731785796c1b
|
|
| BLAKE2b-256 |
98f3ddfc63b4132aff522c301597de0ea46e61300452e8e4103222525ea7ae46
|
Provenance
The following attestation bundles were made for omada_client-1.2.22.tar.gz:
Publisher:
publish-pypi.yml on ErilovNikita/omada-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
omada_client-1.2.22.tar.gz -
Subject digest:
7aec4219ab97d4fc35baf57489e177bf50da463d77fe45bedd7113acfce0c129 - Sigstore transparency entry: 592237462
- Sigstore integration time:
-
Permalink:
ErilovNikita/omada-client@326baa267b59c1b4354b5a27271b160a475dd706 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ErilovNikita
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@326baa267b59c1b4354b5a27271b160a475dd706 -
Trigger Event:
workflow_run
-
Statement type:
File details
Details for the file omada_client-1.2.22-py3-none-any.whl.
File metadata
- Download URL: omada_client-1.2.22-py3-none-any.whl
- Upload date:
- Size: 12.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3674497f9687698151e532e01827172850e1b5607c108605c817ead0e964e8e8
|
|
| MD5 |
e00eb5ff63d9cfcf9f7f7bcc2c1e525f
|
|
| BLAKE2b-256 |
8e50ea872b4533813557ba99e0ce5b80a11463430b7401148ddfaaa6efd1bac8
|
Provenance
The following attestation bundles were made for omada_client-1.2.22-py3-none-any.whl:
Publisher:
publish-pypi.yml on ErilovNikita/omada-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
omada_client-1.2.22-py3-none-any.whl -
Subject digest:
3674497f9687698151e532e01827172850e1b5607c108605c817ead0e964e8e8 - Sigstore transparency entry: 592237464
- Sigstore integration time:
-
Permalink:
ErilovNikita/omada-client@326baa267b59c1b4354b5a27271b160a475dd706 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ErilovNikita
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@326baa267b59c1b4354b5a27271b160a475dd706 -
Trigger Event:
workflow_run
-
Statement type: