Skip to content

TP-Link Omada

The Omada adapter is the gold-standard reference implementation for FreeSDN. It manages TP-Link Omada controller-managed switches, access points, and wireless networks via the Omada Software/Hardware Controller REST API. Every other adapter in the platform is checked against the patterns established here.

FactDetail
MaturityProduction
Gold-standard contractDG ✓ CB ✓ RR ✓ TS ✓ SSRF ✓ RG ✓
Omada controller versions testedSoftware Controller 5.x / Hardware Controller
  • Port enable/disable, PoE on/off/cycle/schedule (802.3af/at/bt)
  • VLAN CRUD with an interactive port-VLAN matrix (untagged / tagged / excluded per cell)
  • LAG (Link Aggregation Group) CRUD - LACP and static modes
  • Port mirroring, port profiles CRUD
  • ACL rules, QoS, STP, IGMP snooping, DHCP snooping
  • Per-port statistics (utilization, PoE draw, LLDP neighbor)
  • SFP module info (type, vendor, wavelength, temperature)
  • Cable diagnostic test, ping, traceroute
  • SSID / WLAN CRUD with per-AP overrides
  • Channel utilization (RF Health) per band (2.4 / 5 / 6 GHz)
  • Rogue-AP detection table (BSSID, SSID, classification)
  • Site-wide radio settings (channel plan, TX power, DFS, band steering, 802.11r/k/v fast roaming)
  • 802.1X configuration and per-port mode (auto / force-authorized / force-unauthorized)
  • Hotspot / captive portal config + voucher management
  • Mesh topology, AP radio config, LED, location
  • List, block, unblock, kick, reconnect, batch operations
  • Upgrade, batch firmware operations with scheduling; upgrade history log
  • Platform-level rollback via POST /api/v1/firmware/devices/{id}/rollback (not Omada-API-native)
  • Backup and restore (controller-level config archive)
  • Config history with diff viewer (side-by-side change audit)
  • 21 WebSocket event handlers for live port link up/down, PoE faults, client connect/disconnect, firmware upgrade progress
PageDescription
SwitchesPagetotal (2,250 main + 12 tab components in switches/tabs/): overview, ports, VLANs, LAGs, profiles, network, config, config history, logs, clients, diagnostics, advanced
AccessPointsPage, 8 tabs: overview, radios (AP radio config), SSIDs (WiFi/SSID management), clients, config, RF Health, rogue APs, radio settings
VlansPageVLAN list + interactive port-VLAN assignment matrix + cross-controller alignment view
FirmwarePageFirmware dashboard, staged rollout, upgrade history
ControllerDetailPageController health and runtime stats (CPU/memory/disk), managed devices list, firmware status, and connection settings (4 tabs: overview, devices, firmware, settings)
/api/v1/switches/*
/api/v1/access-points/*
/api/v1/network/*
/api/v1/gateway-firmware/* ← Omada adapter: firmware upgrade, batch upgrade, schedule CRUD, history
/api/v1/firmware/* ← platform-wide: generic firmware rollback endpoint
/api/v1/poe/*
/api/v1/controllers/*

The Omada adapter connects to the Omada Software Controller or Hardware Controller HTTP/HTTPS API.

FieldValue
credential_typeusername_password
usernameOmada controller administrator username
passwordOmada controller administrator password

Point host at the base URL of your Omada controller, including the protocol and port:

https://omada.example.com:8043

Or, for an Omada hardware controller accessible over HTTP (not recommended for production):

http://192.168.1.1:8088

Set use_ssl: true (the default) to use HTTPS when connecting to the controller. The adapter also supports a separate verify_ssl field (default false) to control whether the TLS certificate is validated - set verify_ssl: false when your controller uses a self-signed certificate you cannot import as a trusted CA. Set use_ssl: false only when your controller is accessible over plain HTTP (not recommended in production).

Terminal window
# Create the controller record (credentials are passed inline - no separate credential store step needed)
curl -X POST https://<freesdn-host>/api/v1/controllers \
-H "Cookie: freesdn_access=<token>" \
-H "X-CSRF-Token: <csrf>" \
-H "Content-Type: application/json" \
-d '{
"name": "omada-prod",
"controller_type": "omada",
"host": "omada.example.com",
"port": 8043,
"use_ssl": true,
"verify_ssl": false,
"site_id": "<freesdn-site-uuid>",
"username": "admin",
"password": "<controller-password>"
}'
# Trigger discovery
curl -X POST https://<freesdn-host>/api/v1/discovery/controllers/<controller-id> \
-H "Cookie: freesdn_access=<token>" \
-H "X-CSRF-Token: <csrf>"

By default FreeSDN operates read-only. To allow the Omada adapter to push changes to your controller:

  1. Set ADAPTER_READ_ONLY=false in your environment file (.env.pro, .env.max, etc.).
  2. Restart the API service: docker compose --env-file .env.pro up -d api.
  3. In the FreeSDN UI, stage a change (e.g., toggle a port PoE setting).
  4. Navigate to Pending Changes and approve the change, confirming force: true.

Both gates must be open simultaneously - the environment flag alone is not enough. Changes are always reviewed on the Pending Changes page before anything is sent to the controller.

The Omada client wraps every request with:

  • Token-bucket rate limiter (default 60 req/min, configurable via OmadaClientConfig.rate_limit_rpm)
  • Concurrency semaphore (default 5 concurrent in-flight requests, rate_limit_concurrent)
  • Retry with exponential backoff (default 3 retries; retries on TimeoutException, connection errors, 502/503/504, 429; does not retry other 4xx or 5xx including 500)
  • Circuit breaker (trips after 5 consecutive failures; 30 s cooldown; exposes freesdn_adapter_circuit_state{adapter,host} Prometheus gauge)

The Omada adapter emits the following Prometheus metrics:

MetricTypeLabels
freesdn_adapter_requests_totalCounteradapter, method, outcome
freesdn_adapter_request_duration_secondsHistogramadapter, method
freesdn_adapter_errors_totalCounteradapter, error_type
freesdn_adapter_circuit_stateGaugeadapter, host
freesdn_adapter_pending_changesGaugeadapter, status

Controller health (login status, error rate, avg latency, circuit state) is exposed via POST /api/v1/controllers/{id}/test.

The Omada client does not URL-encode path segments; the adapter validates every path parameter through validate_id() (1-64 chars, [A-Za-z0-9_.\\-*:], no .. or /) and validate_mac() (standard MAC notation with either colon or hyphen separators, case-insensitive - e.g. AA:BB:CC:DD:EE:FF or aa-bb-cc-dd-ee-ff) before they reach the HTTP client. Requests with invalid identifiers are rejected at the adapter layer with HTTP 400.

  • Omada gateways are limb-only - no Layer 3 gateway/firewall orchestration through this adapter.
  • HA pair status is readable; orchestrated CARP failover is not exposed.

All product names, logos, and brands are property of their respective owners. FreeSDN is an independent project and is not affiliated with or endorsed by the vendors it integrates with. See Trademarks.