Diese Aktionen und Daten können auch für externe Automatisierung oder Monitoring genutzt werden.
Da sich die vorhandene LMC API Doku eher an Programmierer richtet hier mal der Versuch eines einfachen Einstiegs:
1. Anlegen eines API Keys:
Der normale LMC Anmeldeworkflow ist eher für menschliche Benutzer ausgelegt: Benutzername, Passwort, OTP oder ein ähnlicher Login über einen externen Identity Provider.
Für eine Softwareschnittstelle ist das Tokenhandling etwas umständlich, dafür legen wir zunächst einen API Key an.
API-Keys gibt es aktuell nur in Verbindung mit Benutzerkonten. Ihr erstellt also entweder in einem bestehenden Benutzer einen API-Key, oder legt eine "api@..." Mailadresse an und ladet diese auf das Projekt oder die Organisation ein.
Dann geht's in das Benutzerprofil, (oben rechts > Mein Profil > API Keys > (+) Neuen API Key erstellen)
Name vergeben, Konto auswählen (entweder alle Projekte auf die der Benutzer berechtigt ist, oder ein spezifisches Projekt)
Gültigkeitsdauer (default 1 Jahr)
im Nächsten schritt wird der generierte Key angezeigt. --> Key sichern, dieser wird von der LMC nur noch zensiert, aber nie wieder vollständig angezeigt.
In den Projektadministratoren wird nun auch angezeigt, dass ein einzelner Admin einen API-Key mit Zugriff auf dieses Projekt besitzt:
Mit diesem API Key kann man sich nun gegenüber der LMC authentifizieren. Alle Aktionen die gemacht werden, werden mit derselben Berechtigung durchgeführt, die auch der Benutzer auf das Projekt hat, dem der API Key zugewiesen ist.
Dazu wird dem HTTP Request einfach der Authorization Header mit dem API-Key hinzugefügt.
Code: Alles auswählen
ticket="Forumtutorial-basic-request"
author="lna"
apikey="h13r w1rd d0ch w0hl n1ch75 63h31m35 573h3n"
s = requests.Session()
s.headers.update({
'User-Agent': f'API Script {ticket} by {author} with python-requests/{requests.__version__}',
'Authorization': f'LMC-API-KEY {apikey}' # for API Secret Key Authentication uncomment this line
})
Per API-Key Auth ist dies direkt im Log ersichtlich.
Jetzt haben wir die Anmeldung, wissen aber noch nicht viel damit anzufangen.
In der LMC wird alles über eine UUID adressiert.
Wenn wir ein spezifisches Element haben wollen, müssen wir zunächst die UUID kennen.
Für den Einstieg nehmen wir uns diese einfach aus der URL im Browserfenster.
In meinem Projekt habe ich einen Accesspoint. Wenn ich den Accesspoint über die Geräteliste aufrufe bekomme ich folgende URL in der Adresszeile des Browsers:
Code: Alles auswählen
https://cloud.lancom.de/project/938a5c62-2e75-43bc-927e-538b6c5aebca/devices/1f7f81d1-4ccd-4a77-9f0f-55ce49291b99/overview?info-tab=base-info
^[ Projekt UUID ] ^[ Device UUID ]
Dafür nehme ich mir die beiden UUIDs als Variable vor
Code: Alles auswählen
projectuuid="938a5c62-2e75-43bc-927e-538b6c5aebca"
deviceuuid="1f7f81d1-4ccd-4a77-9f0f-55ce49291b99"
Code: Alles auswählen
url = f"{CLOUD_BASE_URL}/cloud-service-devices/accounts/{projectuuid}/devices-table?id={deviceuuid}"
method = "get"
# Funktion aufrufen
device_data = make_request(method, url, s, json_data=None,max_retries=3, rate_limit=0.5)
#prjson(device_data)
print(f"Name = {device_data[0]['status']['name']}")
print(f"Model = {device_data[0]['status']['model']}")
print(f"Serial = {device_data[0]['status']['serial']}")
print_runtime()
print_callcount()
==>
Name = LX-6500Ehotsp
Model = LANCOM LX-6500E
Serial = 4006805616100030
Execution time: 0.8733 seconds
Number of API-Calls: 1
Dass ich Name, Modell und Seriennummer zurück bekomme sehe ich entweder, wenn ich mir in meinem script das komplette Rückgabe JSON ausgeben lasse, oder wenn ich ebenfalls in der API-Dokumentation suche.
Code: Alles auswählen
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"licensingApiVersion": "string",
"firmwareState": "ERROR",
"firmwareUpdateMode": "LMC",
"siteId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"siteName": "string",
"licenseAllocationPending": true,
"status": {
"name": "string",
"model": "string",
"type": "ROUTER",
"serial": "string",
"serialPreconfig": "string",
"ip": "string",
"fwLabel": "string",
"fwMajor": 1,
"fwMinor": 0,
"fwBuild": 0,
"hwMask": 0,
"heartbeatState": "ACTIVE",
"claimingDate": "2026-06-12T15:14:31.950Z",
"firmwarePreferenceState": "FW_PREF_UNDEFINED",
"firstHeartbeatDate": "2026-06-12T15:14:31.950Z",
"lastHeartbeatDate": "2026-06-12T15:14:31.950Z",
"recoveryMode": true,
"lifecycle": {
"status": "SHIPPING",
"eosDate": "2026-06-12T15:14:31.950Z",
"eolDate": "2026-06-12T15:14:31.950Z"
}
},
"config": {
"state": "OUTDATED_CHANGED",
"category": "CURRENT"
},
"deviceLicense": {
"licensed": true,
"expiring": true,
"expiringAt": "2026-06-12T15:14:31.950Z",
"errorStatus": 0,
"reason": "string",
"state": "ACTIVE"
},
"ufLicense": {
"state": "UNKNOWN",
"level": "UNKNOWN",
"allocatedAt": "2026-06-12T15:14:31.950Z",
"supportedFirmware": true,
"migrated": true,
"supportsContainer": true
},
"ufPrepaidLicense": {
"level": "DEMO",
"allocatedAt": "2026-06-12T15:14:31.950Z",
"expiringAt": "2026-06-12T15:14:31.950Z"
},
"stacked": true,
"stackUnitCount": 0,
"customFields": [
{
"fieldId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"value": "string"
}
],
"actions": {
"MERGE": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"alerting": {
"alerts": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
],
"hasAlert": true,
"isMuted": true
},
"offlineOnHold": true
}
]Gibt es wünsche zu komplexeren Themen, die wir uns gemeinsam ansehen sollten?