Hallo Zusammen,
ich bin gerade dabei, bzw. besser gesagt versuche, ein Modul zu entwickeln, welches die Omada SDN API von TP-Link ansprechen kann.
Primärziel ist es, POE per FHEM zu schalten.
Ich habe hierzu mal ganz dreißt, dass 74_Unifi.pm Modul kopiert und etwas angepasst.
Was bereits funktioniert ist das Auslesen einiger Information nach erfolgreichem login.
Da ich selber aber echt kein Perl Profi bin, würde ich mich sehr über Unterstützung freuen.
Vielleicht findet sich ja jemand, der das möglicherweise auch im Einsatz hat und helfen kann und will?
Die API ist recht gut dokumentiert - Siehe Anhang
Hier mal ein aktuelles Listing, was so bisher geht.
Internals:
Cookies TPEAP_SESSIONID=XXXXXXXXXXXXXXXXXXXXXXX; rememberMe=deleteMe
DEF 10.0.0.250 8043 crypt:XXXXXXXXXXXXXXXXXXXXXXXcrypt:XXXXXXXXXXXXXXXXXXXXXXX
FUUID XXXXXXXXXXXXXXXXXXXXXXX
NAME Omada
NOTIFYDEV global
NR 67
NTFY_ORDER 50-Omada
OMADACID XXXXXXXXXXXXXXXXXXXXXXX
OMADACURL https://10.0.0.250:8043/XXXXXXXXXXXXXXXXXXXXXXX/api/v2/
OMADACVERSION 5.5.6
STATE connected
TOKEN XXXXXXXXXXXXXXXXXXXXXXX
TYPE Omada
VERSION 0.1.1
eventCount 8
HTTPCookieHash:
TPEAP_SESSIONID;:
Name TPEAP_SESSIONID
Options Path=/XXXXXXXXXXXXXXXXXXXXXXX; Max-Age=1296000; Expires=Sat, 15-Oct-2022 09:26:13 GMT; Secure; HttpOnly
Path
Value XXXXXXXXXXXXXXXXXXXXXXX
rememberMe;:
Name rememberMe
Options Path=/; Max-Age=0; Expires=Thu, 29-Sep-2022 09:26:14 GMT
Path
Value deleteMe
Omada:
READINGS:
2022-09-30 11:26:45 LoggedInUser Albert Einstein
2022-09-30 11:26:45 site_0_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:26:45 site_0_name Einstein
2022-09-30 11:26:13 state connected
2022-09-30 11:26:44 wlan_0_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:26:44 wlan_0_name Default
2022-09-30 11:26:44 wlan_1_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:26:44 wlan_1_name Night
2022-09-30 11:26:44 wlan_2_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:26:44 wlan_2_name Outdoor
2022-09-30 11:22:20 wlanssid_0_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:22:20 wlanssid_0_name Garten
2022-09-30 11:22:20 wlanssid_1_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:22:20 wlanssid_1_name WLAN-Einstein
2022-09-30 11:22:20 wlanssid_2_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:22:20 wlanssid_2_name WLAN-EinsteinKids
2022-09-30 11:22:20 wlanssid_3_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:22:20 wlanssid_3_name WLAN-EinsteinPrint
2022-09-30 11:22:20 wlanssid_4_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:22:20 wlanssid_4_name WLAN-EinsteinOffice
2022-09-30 11:22:20 wlanssid_5_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:22:20 wlanssid_5_name WLAN-Einstein
2022-09-30 11:22:20 wlanssid_6_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:22:20 wlanssid_6_name WLAN-EinsteinKids
2022-09-30 11:22:20 wlanssid_7_ID XXXXXXXXXXXXXXXXXXXXXXX
2022-09-30 11:22:20 wlanssid_7_name WLAN-EinsteinPrint
accespoints:
alerts_unarchived:
helper:
password crypt:XXXXXXXXXXXXXXXXXXXXXXX
username crypt:XXXXXXXXXXXXXXXXXXXXXXX
httpParams:
header
ignoreredirects 1
loglevel 5
method POST
noshutdown 0
timeout 5
hash:
sslargs:
SSL_verify_mode 0
omada:
CONNECTED connected
eventPeriod 24
interval 30
updateStartTime 1664530004.94297
url https://10.0.0.250:8043
customClientReadings:
attr_value .:^accesspoint|^essid|^hostname|^last_seen|^snr|^uptime|^omadacId|^controllerVer
parts:
0000000_part:
ReadingRegEx ^accesspoint|^essid|^hostname|^last_seen|^snr|^uptime|^omadacId|^controllerVer
nameRegEx .
sites:
XXXXXXXXXXXXXXXXXXXXXXX:
alertNum 0
id XXXXXXXXXXXXXXXXXXXXXXX
lanDeviceConnectedNum 4
lanDeviceDisconnectedNum 0
lanGuestNum 0
lanUserNum 5
name Einstein
region Germany
wlanDeviceConnectedNum 1
wlanDeviceDisconnectedNum 1
wlanDeviceIsolatedNum 0
wlanGuestNum 0
wlanUserNum 9
updateDispatch:
Omada_GetCurrentAccount_Send:
CODE(0x55a8ceb63718)
Omada_GetCurrentAccount_Receive
CODE(0x55a8ceb63760)
Omada_GetWlanSsid_Send:
CODE(0x55a8ceb638c8)
Omada_GetWlanSsid_Receive
CODE(0x55a8ceb63910)
Omada_ProcessUpdate:
CODE(0x55a8ceb63958)
wlan:
XXXXXXXXXXXXXXXXXXXXXXX:
id XXXXXXXXXXXXXXXXXXXXXXX
name Default
site XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX:
clonedWlanId XXXXXXXXXXXXXXXXXXXXXXX
id XXXXXXXXXXXXXXXXXXXXXXX
name Night
site XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX:
clonedWlanId XXXXXXXXXXXXXXXXXXXXXXX
id XXXXXXXXXXXXXXXXXXXXXXX
name Outdoor
site XXXXXXXXXXXXXXXXXXXXXXX
Attributes:
room Omada
verbose 5
Und nein... ich heiße nicht Albert Einstein und die IDs sind durch XXXX... geschwärzt.
Habe es nun letztlich mit HTTPMOD gelöst.
Ist zwar ein bisschen unschön, aber funktioniert.
Bei Interesse - einfach melden.
Servus
Ich nutze auch Omada, bei Perl bin ich aber leider komplett raus. Könntest du bitte dein HTTPMOD Device posten?
Danke und Grüße
Andy
Servus Andy,
Ich hab mehrere Devices angelegt, weil man sonst Millionen an Readings hat.
Kann ich aber gerne morgen mal teilen, wie ich es gelöst habe.
Welche Controller Version hast du?
Das wär super :)
Ich habe den OC200 2.0 mit 5.5.7
Alles klar, das sollte dann so auch gehen.
Ich nutze bei mir den Linux Software Controller. Mal sehen...
IP und Port muss natürlich angepasst werden.
Habe zu allererst einen HTTPMOD:
define Omada HTTPMOD https://ip:port/api/info 3200
Mit folgenden Attributen:
enableControlSet 1
enableCookies 1
getHeader1 Content-Type: application/json
handleRedirects 0
reading100JSON result_supportApp
reading100Name result_supportApp
reading101JSON result_omadacId
reading101Name result_omadacId
reading102JSON result_controllerVer
reading102Name result_controllerVer
reading103JSON result_configured
reading103Name result_configured
reading104JSON errorCode
reading104Name errorCode
reading105JSON msg
reading105Name msg
reading106JSON result_apiVer
reading106Name result_apiVer
reading107JSON result_type
reading107Name result_type
requestHeader1 Content-Type: application/json
room Omada
sslArgs SSL_VERIFY_NONE
stateFormat result_controllerVer
Wichtig ist hier das Reading: result_omadacId
Dieses wird später für die Anmeldung benötigt.
Irreführend ist die API Version. Das Reading wird wahrscheinlich auch ,,3" ausspucken. Version 3 funktioniert bei mir aber nicht.
Sollten hier schon erfolgreiche Readings erscheinen können wir weiter machen.
Ansonsten mal dringend nachsehen, ob bei der der Login über HTTPS an ist.
HTTP sollte aber auch gehen.
Super, hat geklappt. :)
Mit dem einzigen Unterschied dass im def bei einem Hardwarecontroller kein Port angegeben werden muss.
2022-10-13 10:21:46 errorCode 0
setstate Omada 5.5.7
setstate Omada 2022-10-13 10:29:42 errorCode 0
setstate Omada 2022-10-13 10:29:42 msg Success.
setstate Omada 2022-10-13 10:29:42 result_apiVer 3
setstate Omada 2022-10-13 10:29:42 result_configured 1
setstate Omada 2022-10-13 10:29:42 result_controllerVer 5.5.7
setstate Omada 2022-10-13 10:29:42 result_omadacId XXXXXXXXXXXXX
setstate Omada 2022-10-13 10:29:42 result_supportApp 1
setstate Omada 2022-10-13 10:29:42 result_type 10
Alles klar, dann ist der Rest eigentlich recht einfach.
Laut Omada SDN Doku sollte man sich einen eigenen Admin Benutzer für die API anlegen (habe ich aber nicht gemacht)
define OmadaSites HTTPMOD https://ip:port/%%omadacId%%/api/v%%apiVer%%/sites/default?currentPage=1¤tPageSize=1000 3600
mit den Attributen:
enableControlSet 1
enableCookies 1
getHeader1 Content-Type: application/json
getHeader2 Csrf-Token: $sid
handleRedirects 0
reAuthAlways 1
reading100JSON result_name
reading100Name result_name
reading101JSON result_primary
reading101Name result_primary
reading102JSON result_scenario
reading102Name result_scenario
reading103JSON result_id
reading103Name result_id
reading104JSON result_timeZone
reading104Name result_timeZone
reading105JSON result_region
reading105Name result_region
reading106JSON msg
reading106Name msg
reading107JSON errorCode
reading107Name errorCode
reading108JSON result_omadacId
reading108Name result_omadacId
replacement01Mode expression
replacement01Regex %%omadacId%%
replacement01Value ReadingsVal("Omada", "result_omadacId", "")
replacement02Mode text
replacement02Regex %%apiVer%%
replacement02Value 2
requestHeader1 Content-Type: application/json
requestHeader2 Csrf-Token: $sid
room Omada
sid01Data {"username":"APINUTZERNAME","password":"APINUTZERPASSWORT"}
sid01Header Content-Type: application/json
sid01IdJSON result_token
sid01URL https://ip:port/%%omadacId%%/api/v%%apiVer%%/login
sslArgs SSL_VERIFY_NONE
stateFormat msg result_name
verbose 0
reAuthAlways kann natürlich auch durch tolle Funktionen ersetzt werden... Wäre da offen für Input, wie man das schöner löst.
reAuthJSON / reAuthRegex
sid01Data kann natürlich auch noch versteckt werden.
Durch die replacement... Atrribute werden die erforderlichen Readings des der vorigen HTTPMODS schön weiter verwendet.
Nun hat man eigentlich schon fast alles was man braucht.
Um zum Beispiel an die grobe POE Auslastung zu kommen (geht auch genauer über die Insight API)
https://ip:port/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/dashboard/poeUtilization 60
Hier habe ich dann ExtractAllJSON verwendet um an alle Readings zu kommen.
Attribute:
enableControlSet 1
enableCookies 1
event-on-update-reading .*
getHeader1 Content-Type: application/json
getHeader2 Csrf-Token: $sid
handleRedirects 0
reAuthAlways 1
extractAllJSON 2
replacement01Mode expression
replacement01Regex %%omadacId%%
replacement01Value ReadingsVal("Omada", "result_omadacId", "")
replacement02Mode text
replacement02Regex %%apiVer%%
replacement02Value 2
replacement03Mode expression
replacement03Regex %%siteId%%
replacement03Value ReadingsVal("OmadaSites", "result_id", "")
requestHeader1 Content-Type: application/json
requestHeader2 Csrf-Token: $sid
room Omada
sid01Data {"username":"APINUTZERNAME","password":"APINUTZERPASSWORT"}
sid01Header Content-Type: application/json
sid01IdJSON result_token
sid01URL https://ip:port/%%omadacId%%/api/v%%apiVer%%/login
sslArgs SSL_VERIFY_NONE
Die API hatte ich ja schon angehängt, da ist dann alles weitere erklärt..
Sorry das ich mich jetzt erst melde, bin erst heute dazugekommen...
Funktioniert bisher super :)
Hast du zufällig noch eine fertige def um einen reconnect eines clients durchzuführen? Das ist eigentlich das einzige was ich aktuell brauchen würde.
Hab mir die API schon angesehen, aber dafür brauche ich ja ein POST statt ein GET, das habe ich bisher noch nicht hinbekommen...
Grüße
Andy
Zum Beispiel - ist zwar ein Patch sollte aber als Post genau so gehen.
attr OmadaSettingLanProfiles set01Data {\
"id": "%%AZdataid%%",\
"site": "63593f6d9a4a5d07fb951330",\
"name": "%%AZdataname%%",\
"poe": "$val",\
"nativeNetworkId": "63593f6e9a4a5d07fb951341",\
"tagNetworkIds": [\
"63593f6e9a4a5d07fb951342",\
"63593f6e9a4a5d07fb951343",\
"63593f6e9a4a5d07fb951344",\
"63593f6e9a4a5d07fb951345",\
"63593f6e9a4a5d07fb951347",\
"63593f6e9a4a5d07fb951348",\
"63701dfa61aee228a8a675e9",\
"6371f11061aee228a8a6951e"\
],\
"untagNetworkIds": [],\
"dot1x": 1,\
"portIsolationEnable": false,\
"lldpMedEnable": true,\
"bandWidthCtrlType": 0,\
"spanningTreeEnable": false,\
"loopbackDetectEnable": false\
}
attr OmadaSettingLanProfiles set01Hint 0,1,2
attr OmadaSettingLanProfiles set01Max 2
attr OmadaSettingLanProfiles set01Method PATCH
attr OmadaSettingLanProfiles set01Min 0
attr OmadaSettingLanProfiles set01Name AZ_POE
attr OmadaSettingLanProfiles set01URL https://ip:port/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/lan/profiles/%%AZdataid%%
Zitat von: MatthiasL am 12 Oktober 2022, 13:01:06
Alles klar, das sollte dann so auch gehen.
Ich nutze bei mir den Linux Software Controller. Mal sehen...
IP und Port muss natürlich angepasst werden.
Habe zu allererst einen HTTPMOD:
define Omada HTTPMOD https://ip:port/api/info 3200
Mit folgenden Attributen:
enableControlSet 1
enableCookies 1
getHeader1 Content-Type: application/json
handleRedirects 0
reading100JSON result_supportApp
reading100Name result_supportApp
reading101JSON result_omadacId
reading101Name result_omadacId
reading102JSON result_controllerVer
reading102Name result_controllerVer
reading103JSON result_configured
reading103Name result_configured
reading104JSON errorCode
reading104Name errorCode
reading105JSON msg
reading105Name msg
reading106JSON result_apiVer
reading106Name result_apiVer
reading107JSON result_type
reading107Name result_type
requestHeader1 Content-Type: application/json
room Omada
sslArgs SSL_VERIFY_NONE
stateFormat result_controllerVer
Wichtig ist hier das Reading: result_omadacId
Dieses wird später für die Anmeldung benötigt.
Irreführend ist die API Version. Das Reading wird wahrscheinlich auch ,,3" ausspucken. Version 3 funktioniert bei mir aber nicht.
Sollten hier schon erfolgreiche Readings erscheinen können wir weiter machen.
Ansonsten mal dringend nachsehen, ob bei der der Login über HTTPS an ist.
HTTP sollte aber auch gehen.
HI, danke für das teilen der Infos.
Das hab ich noch geschafft, aber alles weitere was du an Code geteilt hast geht bei mir nicht. :(
Der Link "https://MEINE IP + PORT/%%omadacId%%/api/v%%apiVer%%/sites/default?currentPage=1¤tPageSize=1000 3600" geht nicht da kommt Error 400.
Kannst du das für Dumme ganz einfach erklären bitte. :)
Ich möchte gerne den Zustand der AP's sehen, das Gästeweife ein/aus schalten, Clients anzeigen die verbunden/nicht verbunden sind.
Das wäre mega toll.
Danke
LG
KOAL
Hast du auch die entsprechenden Attribute gesetzt?
enableControlSet 1
enableCookies 1
event-on-update-reading .*
getHeader1 Content-Type: application/json
getHeader2 Csrf-Token: $sid
handleRedirects 0
reAuthAlways 1
extractAllJSON 2
replacement01Mode expression
replacement01Regex %%omadacId%%
replacement01Value ReadingsVal("Omada", "result_omadacId", "")
replacement02Mode text
replacement02Regex %%apiVer%%
replacement02Value 2
replacement03Mode expression
replacement03Regex %%siteId%%
replacement03Value ReadingsVal("OmadaSites", "result_id", "")
requestHeader1 Content-Type: application/json
requestHeader2 Csrf-Token: $sid
room Omada
sid01Data {"username":"APINUTZERNAME","password":"APINUTZERPASSWORT"}
sid01Header Content-Type: application/json
sid01IdJSON result_token
sid01URL https://ip:port/%%omadacId%%/api/v%%apiVer%%/login
sslArgs SSL_VERIFY_NONE
Wie heißt dein erstes Device?
Bei den Replacements (replacementXXValue...) muss der Name passen.
Hoffe das hilft weiter.
Zitat von: Supadone am 26 November 2022, 17:44:23
Sorry das ich mich jetzt erst melde, bin erst heute dazugekommen...
Funktioniert bisher super :)
Hast du zufällig noch eine fertige def um einen reconnect eines clients durchzuführen? Das ist eigentlich das einzige was ich aktuell brauchen würde.
Hab mir die API schon angesehen, aber dafür brauche ich ja ein POST statt ein GET, das habe ich bisher noch nicht hinbekommen...
Grüße
Andy
So gehts:
Mit set NAME reconnectClient 00-00-00-00-00 (Device MAC)
set01Header01 Content-Type: application/x-www-form-urlencoded
set01Header02 Csrf-Token: $sid
set01Method POST
set01Name reconnectClient
set01TextArg 1
set01URL https://ip:port/%%omadacId%%/api/v2/sites/%%siteId%%/cmd/clients/$val/reconnect
HI,
also ich hab ein Device "Omada_PAPA" angelegt. Bild OMADA_1
Dann hab ich noch das Device "OmadaSites_PAPA" angelegt, und hier steck ich. Bid: OMADA_2, OMADA_3
Das was ich gelb mariert habe, da bin ich mir nicht sicher ob ich das mit meinen Daten befüllen muss oder ob das vom ersten Device kommt?
Bei username und pasword hab ich die Logindaten vom Controller Administrator eingetragen.
Danke für die Hilfe.
LG
KOAL
IP:Port bitte immer durch echt Werte ersetzen.
Und Replacement02Value ApiVer 2! Nicht 3!
Zitat von: MatthiasL am 02 Dezember 2022, 11:54:12
So gehts:
Mit set NAME reconnectClient 00-00-00-00-00 (Device MAC)
set01Header01 Content-Type: application/x-www-form-urlencoded
set01Header02 Csrf-Token: $sid
set01Method POST
set01Name reconnectClient
set01TextArg 1
set01URL https://ip:port/%%omadacId%%/api/v2/sites/%%siteId%%/cmd/clients/$val/reconnect
Super, funktioniert auf Anhieb :) Tausend Dank :)
Grüße
Andy
HI,
ich kann nun auch denk ich auch alles lesen. :)
Danke für dei Hilfe, das mit dem http auslesen hab ich noch nie so verstanden.
Wenn ich ein Wifi abschalten möchte (GästeWifi) kann ich das über POST machen?
.../{omadacId}/api/v2/sites/{siteId}/setting/wlans/{wlanId}/ssids/{ssidId} und dann auf " action" ein "0" senden?
Wie kann ich den was senden? >> So wie Andy mit dem Client reconnect?
Danke
LG
KOAL
Das müsste mit einem Patch gehen. Antwort #9
Habe ich aber auch schon mal probiert, ging aber nicht.
Müsste ich auch noch mal ansehen.
Zitat von: KOAL am 02 Dezember 2022, 20:59:59
HI,
ich kann nun auch denk ich auch alles lesen. :)
Danke für dei Hilfe, das mit dem http auslesen hab ich noch nie so verstanden.
Wenn ich ein Wifi abschalten möchte (GästeWifi) kann ich das über POST machen?
.../{omadacId}/api/v2/sites/{siteId}/setting/wlans/{wlanId}/ssids/{ssidId} und dann auf " action" ein "0" senden?
Wie kann ich den was senden? >> So wie Andy mit dem Client reconnect?
Danke
LG
KOAL
Also das geht dann mit einem Zeitplan - von 00:00 - 24:00 Uhr auf der SSID.
Sonst frisst er "Action" nicht.
Hier noch das Listing zum Ein/Aus-schalten von WiFi SSIDs.
Wichtig - es muss ein Zeitplan dazu existieren.
Außerdem müssen die Daten in Set Data entsprechend euren Settings gesetzt werden.
set02Data {
"name": "SSID NAME",
"band": ,
"guestNetEnable": ,
"security": ,
"broadcast": ,
"vlanEnable": ,
"vlanId": ,
"portalEnable": ,
"accessEnable": ,
"rateLimit": {
"downLimitEnable": ,
"upLimitEnable":
},
"pskSetting": {
"versionPsk": ,
"encryptionPsk": ,
"gikRekeyPskEnable": ,
"securityKey": ""
},
"wlanScheduleEnable": true,
"action": $val,
"scheduleId": "",
"macFilterEnable": ,
"rateAndBeaconCtrl": {
"rate2gCtrlEnable": ,
"rate5gCtrlEnable":
},
"multiCastSetting": {
"multiCastEnable": ,
"arpCastEnable": ,
"filterEnable":
}
}
set02Hint 0,1
set02Max 1
set02Method PATCH
set02Min 0
set02Name DEIN_NAME
set02URL https://ip:port/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/wlans/%%wlanId%%/ssids/%%ssidId%%
setHeader1 Content-Type: application/json
setHeader2 Csrf-Token: $sid
%%wlanÍD%% bekommt man aus: https://ip:port/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/wlans
result_data_XX_id
%%ssidId%% bekommt man aus: https://ip:port/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/wlans/%%wlanId%%/ssids
result_data_XX_id
Danke,
werd ich versuchen sobald ich wieder gesund bin :)
super Hilfe bisher :) :)
LG
KOAL
Hallo MatthiasL,
erst mal vielen Dank für die ganze Arbeit und ich kann bereits aus fhem auf Omada zugreifen. Auslesen vom groben POE Status und den Sites wie von dir beschrieben geht auch.
Jetzt möchte ich noch einen POE Port komplett aus bzw. ein schalten ("Switch-SG2008P, Port2") und hänge gerade etwas in der Luft. Übers Webinterface habe ich es bereits gut versteckt gefunden.
Du hast ja bereits die Set Befehle für den Reconnect und auch das schalten vom WiFi gepostet und wo man die Infos zum WiFi findet.
Die Infos zum PoE müsste ich unter "/{omadacId}/api/v2/sites/{siteId}/insight/switch/port/poe" (kopiert aus der API Doku) finden.
Jetzt die Fragen:
- Hast du zum Schalten deines PoE Ports ein komplett neues Device angelegt? (falls ja kannst du bitte evtl. die entsprechenden Infos posten?)
- Falls kein Device dasteht über die angepassten Set Befehle zum schalten von WiFi bzw reconnect (wie schon vorher gepostet) => muss ich die set befehle definieren und wenn ja in welchem Device?
Aktuell läuft ein ER605 V2, Omada Software Controller auf Linux 5.7.4, er SG3210 und der SG2008P.
Mit fhem bin ich schon seit Jahren unterwegs, nur mit dem HTTPMOD bin ich bisher noch komplett raus.
Vielen Dank und Grüße
Loopo
Hi,
Das Device zum schalten von POE ist am größten, weil per PATCH sämtliche NetworkIDs (tagged und untagged) mitgegeben werden müssen.
Ich habe dazu noch ein Decoding Device angelegt weil die IDs der Ports sich nach Updates gerne mal ändern.
Ich poste am Montag mal die Listings. Es ist wirklich ziemlich aufwändig, funktioniert am Ende aber Prima.
Zitat von: Loopo am 14 Januar 2023, 11:40:00
Hallo MatthiasL,
erst mal vielen Dank für die ganze Arbeit und ich kann bereits aus fhem auf Omada zugreifen. Auslesen vom groben POE Status und den Sites wie von dir beschrieben geht auch.
Jetzt möchte ich noch einen POE Port komplett aus bzw. ein schalten ("Switch-SG2008P, Port2") und hänge gerade etwas in der Luft. Übers Webinterface habe ich es bereits gut versteckt gefunden.
Du hast ja bereits die Set Befehle für den Reconnect und auch das schalten vom WiFi gepostet und wo man die Infos zum WiFi findet.
Die Infos zum PoE müsste ich unter "/{omadacId}/api/v2/sites/{siteId}/insight/switch/port/poe" (kopiert aus der API Doku) finden.
Jetzt die Fragen:
- Hast du zum Schalten deines PoE Ports ein komplett neues Device angelegt? (falls ja kannst du bitte evtl. die entsprechenden Infos posten?)
- Falls kein Device dasteht über die angepassten Set Befehle zum schalten von WiFi bzw reconnect (wie schon vorher gepostet) => muss ich die set befehle definieren und wenn ja in welchem Device?
Aktuell läuft ein ER605 V2, Omada Software Controller auf Linux 5.7.4, er SG3210 und der SG2008P.
Mit fhem bin ich schon seit Jahren unterwegs, nur mit dem HTTPMOD bin ich bisher noch komplett raus.
Vielen Dank und Grüße
Loopo
Jetzt wirds schon irgendwie unangenehm glaube ich.
%%addr%% habe ich mittlerweile mittels "SetReading" im Omada Device gesetzt: https://IP:PORT
Die NetzwerkProfile auf meinen 4 relevanten POE Ports, die ich schalten kann heißen:
AllAZPoe, AllWZPoe, AllOutdoorPoe und AllWiFiPoe.
Da du nur einen Port explizit schalten möchtest, wird das natürlich einfacher...Müsste im Regex entsprechend angepasst werden...
define OmadaSettingLanProfiles HTTPMOD %%addr%%/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/lan/profiles?currentPage=1¤tPageSize=1000 3600
enableControlSet 1
enableCookies 1
event-on-update-reading .*
extractAllJSON 1
get01CheckAllReadings 1
get01Name SettingLanProfiles
get01URL %%addr%%/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/lan/profiles?currentPage=1¤tPageSize=1000
getHeader1 Content-Type: application/json
getHeader2 Csrf-Token: $sid
handleRedirects 0
reAuthAlways 0
reAuthRegex <!DOCTYPE HTML>
reading101JSON result_data_01_tagNetworkIds_.*
reading101Name result_data_01_tagNetworkIds
reading101RecombineExpr join '","', @matchlist
reading102JSON result_data_02_tagNetworkIds_.*
reading102Name result_data_02_tagNetworkIds
reading102RecombineExpr join '","', @matchlist
reading103JSON result_data_03_tagNetworkIds_.*
reading103Name result_data_03_tagNetworkIds
reading103RecombineExpr join '","', @matchlist
reading104JSON result_data_04_tagNetworkIds_.*
reading104Name result_data_04_tagNetworkIds
reading104RecombineExpr join '","', @matchlist
reading105JSON result_data_05_tagNetworkIds_.*
reading105Name result_data_05_tagNetworkIds
reading105RecombineExpr join '","', @matchlist
reading106JSON result_data_06_tagNetworkIds_.*
reading106Name result_data_06_tagNetworkIds
reading106RecombineExpr join '","', @matchlist
reading107JSON result_data_07_tagNetworkIds_.*
reading107Name result_data_07_tagNetworkIds
reading107RecombineExpr join '","', @matchlist
reading108JSON result_data_08_tagNetworkIds_.*
reading108Name result_data_08_tagNetworkIds
reading108RecombineExpr join '","', @matchlist
reading109JSON result_data_09_tagNetworkIds_.*
reading109Name result_data_09_tagNetworkIds
reading109RecombineExpr join '","', @matchlist
reading110JSON result_data_10_tagNetworkIds_.*
reading110Name result_data_10_tagNetworkIds
reading110RecombineExpr join '","', @matchlist
reading111JSON result_data_11_tagNetworkIds_.*
reading111Name result_data_11_tagNetworkIds
reading111RecombineExpr join '","', @matchlist
reading112JSON result_data_12_tagNetworkIds_.*
reading112Name result_data_12_tagNetworkIds
reading112RecombineExpr join '","', @matchlist
reading113JSON result_data_13_tagNetworkIds_.*
reading113Name result_data_13_tagNetworkIds
reading113RecombineExpr join '","', @matchlist
reading114JSON result_data_14_tagNetworkIds_.*
reading114Name result_data_14_tagNetworkIds
reading114RecombineExpr join '","', @matchlist
reading115JSON result_data_15_tagNetworkIds_.*
reading115Name result_data_15_tagNetworkIds
reading115RecombineExpr join '","', @matchlist
reading116JSON result_data_16_tagNetworkIds_.*
reading116Name result_data_16_tagNetworkIds
reading116RecombineExpr join '","', @matchlist
replacement01Mode expression
replacement01Regex %%omadacId%%
replacement01Value ReadingsVal("Omada", "omadacId", "")
replacement02Mode text
replacement02Regex %%apiVer%%
replacement02Value 2
replacement03Mode expression
replacement03Regex %%siteId%%
replacement03Value ReadingsVal("OmadaSites", "id", "")
replacement04Mode key
replacement04Regex %%password%%
replacement04Value password
replacement05Mode expression
replacement05Regex %%AZdataname%%
replacement05Value ReadingsVal("OmadaDecode", "AZdataname", "")
replacement06Mode expression
replacement06Regex %%Outdoordataid%%
replacement06Value ReadingsVal("OmadaDecode", "Outdoordataid", "")
replacement07Mode expression
replacement07Regex %%Outdoordataname%%
replacement07Value ReadingsVal("OmadaDecode", "Outdoordataname", "")
replacement08Mode expression
replacement08Regex %%WZdataid%%
replacement08Value ReadingsVal("OmadaDecode", "WZdataid", "")
replacement09Mode expression
replacement09Regex %%WZdataname%%
replacement09Value ReadingsVal("OmadaDecode", "WZdataname", "")
replacement10Mode expression
replacement10Regex %%WiFidataid%%
replacement10Value ReadingsVal("OmadaDecode", "WiFidataid", "")
replacement11Mode expression
replacement11Regex %%WiFidataname%%
replacement11Value ReadingsVal("OmadaDecode", "WiFidataname ", "")
replacement12Mode expression
replacement12Regex %%AZdataid%%
replacement12Value ReadingsVal("OmadaDecode", "AZdataid", "")
replacement13Mode expression
replacement13Regex %%AZdatanativeNetworkId%%
replacement13Value ReadingsVal("OmadaDecode", "AZdatanativeNetworkId", "")
replacement14Mode expression
replacement14Regex %%OutdoordatanativeNetworkId%%
replacement14Value ReadingsVal("OmadaDecode", "OutdoordatanativeNetworkId", "")
replacement15Mode expression
replacement15Regex %%WZdatanativeNetworkId%%
replacement15Value ReadingsVal("OmadaDecode", "WZdatanativeNetworkId ", "")
replacement16Mode expression
replacement16Regex %%WiFidatanativeNetworkId%%
replacement16Value ReadingsVal("OmadaDecode", "WiFidatanativeNetworkId", "")
replacement17Mode expression
replacement17Regex %%AZtagNetworkIds%%
replacement17Value ReadingsVal("Omada", "AZtagNetworkIds", "")
replacement18Mode expression
replacement18Regex %%WZtagNetworkIds%%
replacement18Value ReadingsVal("Omada", "WZtagNetworkIds", "")
replacement19Mode expression
replacement19Regex %%WiFitagNetworkIds%%
replacement19Value ReadingsVal("Omada", "WiFitagNetworkIds", "")
replacement20Mode expression
replacement20Regex %%addr%%
replacement20Value ReadingsVal("Omada", "addr", "")
replacement21Mode expression
replacement21Regex %%OutdoortagNetworkIds%%
replacement21Value ReadingsVal("Omada", "OutdoortagNetworkIds", "")
requestHeader1 Content-Type: application/json
requestHeader2 Csrf-Token: $sid
room Omada
set01Data {
"id": "%%AZdataid%%",
"site": "%%siteId%%",
"name": "%%AZdataname%%",
"poe": "$val",
"nativeNetworkId": "%%AZdatanativeNetworkId%%",
"tagNetworkIds": [AZtagNetworkIds],
"untagNetworkIds": [],
"dot1x": 1,
"portIsolationEnable": false,
"lldpMedEnable": true,
"bandWidthCtrlType": 0,
"spanningTreeEnable": false,
"loopbackDetectEnable": false
}
set01Hint 0,1,2
set01Max 2
set01Method PATCH
set01Min 0
set01Name AZ_POE
set01URL %%addr%%/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/lan/profiles/%%AZdataid%%
set02Data {
"id": "%%WZdataid%%",
"site": "%%siteId%%",
"name": "%%WZdataname%%",
"poe": "$val",
"nativeNetworkId": "%%WZdatanativeNetworkId %%",
"tagNetworkIds": [WZtagNetworkIds],
"untagNetworkIds": [],
"dot1x": 1,
"portIsolationEnable": false,
"lldpMedEnable": true,
"bandWidthCtrlType": 0,
"spanningTreeEnable": false,
"loopbackDetectEnable": false
}
set02Hint 0,1,2
set02Max 2
set02Method PATCH
set02Min 0
set02Name WZ_POE
set02URL %%addr%%/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/lan/profiles/%%WZdataid%%
set03Data {
"id": "%%Outdoordataid%%",
"site": "%%siteId%%",
"name": "%%Outdoordataname%%",
"poe": "$val",
"nativeNetworkId": "%%OutdoordatanativeNetworkId %%",
"tagNetworkIds": [OutdoortagNetworkIds],
"untagNetworkIds": [],
"dot1x": 1,
"portIsolationEnable": false,
"lldpMedEnable": true,
"bandWidthCtrlType": 0,
"spanningTreeEnable": false,
"loopbackDetectEnable": false
}
set03Hint 0,1,2
set03Max 2
set03Method PATCH
set03Min 0
set03Name Outdoor_POE
set03URL %%addr%%/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/lan/profiles/%%Outdoordataid%%
set04Data {
"id": "%%WiFidataid%%",
"site": "%%siteId%%",
"name": "%%WiFidataname%%",
"poe": "$val",
"nativeNetworkId": "%%WiFidatanativeNetworkId%%",
"tagNetworkIds": [WiFitagNetworkIds],
"untagNetworkIds": [],
"dot1x": 1,
"portIsolationEnable": false,
"lldpMedEnable": true,
"bandWidthCtrlType": 0,
"spanningTreeEnable": false,
"loopbackDetectEnable": false
}
set04Hint 0,1,2
set04Max 2
set04Method PATCH
set04Min 0
set04Name WiFi_POE
set04URL %%addr%%/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/setting/lan/profiles/%%WiFidataid%%
setHeader1 Content-Type: application/json
setHeader2 Csrf-Token: $sid
showMatched 0
sid01Data {"username":"admin","password":"%%password%%"}
sid01Header Content-Type: application/json
sid01IdJSON result_token
sid01URL %%addr%%/%%omadacId%%/api/v%%apiVer%%/login
sslArgs SSL_VERIFY_NONE
stateFormat result_data_02_name result_data_02_poe result_data_03_name result_data_03_poe result_data_04_name result_data_04_poe result_data_05_name result_data_05_poe
Das Decoding Device ist ein
Notify:
OmadaSettingLanProfiles:result_data_[0-9][0-9]_name:.All[a-zA-Z0-9]*Poe.* {
my ($num) = $EVTPART0 =~ /([\d]+)/; #14
my ($poe) = $EVTPART1 =~ /(All([a-zA-Z0-9]*)Poe)/;
my ($poedev) = $EVTPART1 =~ /All([a-zA-Z0-9]*)Poe/;
fhem("setReading OmadaDecode $poedev $num");
my $quellReading = $num."_name";
if (ReadingsVal("OmadaSettingLanProfiles",$quellReading,"") eq $poe) {fhem("setReading OmadaDecode $poedev $num")};
}
event-on-update-reading .*
room Omada
userReadings AZdataid {
my $resultnumber = ReadingsVal($NAME,"AZ","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_id","");;
}, AZdataname {
my $resultnumber = ReadingsVal($NAME,"AZ","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_name","");;
}, AZdatanativeNetworkId {
my $resultnumber = ReadingsVal($NAME,"AZ","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_nativeNetworkId","");;
}, AZdatatagNetworkIds {
my $resultnumber = ReadingsVal($NAME,"AZ","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_tagNetworkIds","");;
my $tagList = '"'.$result.'"'
}, WZdataid {
my $resultnumber = ReadingsVal($NAME,"WZ","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_id","");;
}, WZdataname {
my $resultnumber = ReadingsVal($NAME,"WZ","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_name","");;
}, WZdatanativeNetworkId {
my $resultnumber = ReadingsVal($NAME,"AZ","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_nativeNetworkId","");;
}, WZdatatagNetworkIds {
my $resultnumber = ReadingsVal($NAME,"WZ","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_tagNetworkIds","");;
my $tagList = '"'.$result.'"'
}, Outdoordataid {
my $resultnumber = ReadingsVal($NAME,"Outdoor","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_id","");;
}, Outdoordataname {
my $resultnumber = ReadingsVal($NAME,"Outdoor","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_name","");;
}, OutdoordatanativeNetworkId {
my $resultnumber = ReadingsVal($NAME,"Outdoor","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_nativeNetworkId","");;
}, OutdoordatatagNetworkIds {
my $resultnumber = ReadingsVal($NAME,"Outdoor","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_tagNetworkIds","");;
my $tagList = '"'.$result.'"'
}, WiFidataid {
my $resultnumber = ReadingsVal($NAME,"WiFi","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_id","");;
}, WiFidataname {
my $resultnumber = ReadingsVal($NAME,"WiFi","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_name","");;
}, WiFidatanativeNetworkId {
my $resultnumber = ReadingsVal($NAME,"WiFi","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_nativeNetworkId","");;
}, WiFidatatagNetworkIds {
my $resultnumber = ReadingsVal($NAME,"WiFi","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_tagNetworkIds","");;
my $tagList = '"'.$result.'"'
}
Viel Spaß damit und vor allem Viel Erfolg.
Bei Fragen, gerne melden...
Wow... das ist richtig viel Arbeit!
1000 Dank dafür!
Bin aktuell noch dabei das ganze auf meine Anforderung zu adaptieren.
Lan Profil erstellt "AllITPoe", die beiden Devices laufen und zeigen etwas an. Nur das schalten klappt noch nicht so ganz.
Ich schau morgen nochmal in Ruhe an.
Also ich bekomme es nicht zum laufen. Was ich bisher gemacht habe:
In Omada habe ich ein Profil "AllITPoe" angelegt und Port 2 meines SG2008P zugewiesen. Einstellungen beim Port und im Profil sind so eingestellt, dass Profil immer Device überschreibt.
Attribute des OmadaSettingLanProfiles device habe ich übernommen, auslesen aus dem Omada klappt. "set01Name" = IT_POE", "set01Data" habe ich wie folgt angepasst:
{\
"id": "%%ITdatanativeNetworkId%%",
"site": "%%siteId%%",
"name": "%%ITdataname%%",
"poe": "$val",
"nativeNetworkId": "%%ITdatanativeNetworkId%%",
"tagNetworkIds": [ITtagNetworkIds],
"untagNetworkIds": [],
"dot1x": 1,
"portIsolationEnable": false,
"lldpMedEnable": true,
"bandWidthCtrlType": 0,
"spanningTreeEnable": false,
"loopbackDetectEnable": false
}
Die anderen 3 Profile samt dazugehörigen replacements sind raus geflogen.
Ebenfalls angepasst sind die replacements für %%ITdadaname%%, %%ITdataid%% und %%ITdatanativeNetworkId%%. Passwort, Nutzername, addr etc auch.
Auslesen funktioniert.
Die Attribute (userReadings) vom OmadaDecode notify sind wie folgt angepasst:
ITdataid {
my $resultnumber = ReadingsVal($NAME,"IT","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_id","");;
}, ITdataname {
my $resultnumber = ReadingsVal($NAME,"IT","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_name","");;
}, ITdatanativeNetworkId {
my $resultnumber = ReadingsVal($NAME,"IT","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_nativeNetworkId","");;
}, ITdatatagNetworkIds {
my $resultnumber = ReadingsVal($NAME,"IT","");;
my $result = ReadingsVal("OmadaSettingLanProfiles","result_data_".$resultnumber."_tagNetworkIds","");;
my $tagList = '"'.$result.'"'
}
die Readings werden meiner Meinung nach auch richtig aus dem OmadaSettingLanProfiles device richtig übernommen und auch richtig benannt.
Wenn ich "set OmadaSettingLanProfiles IT_POE 1" (oder einen anderen Wert) auswähle, passiert in Omada garnix.
Fragen:
1. Muss ich den Namen des Profils in Omada noch anpassen (AllITPoe) oder in Omada noch etwas einrichten (Zeitplan wie bei WiFi?).
2. Beim "%%ITtagNetworkIds%%" beziehst du dich auf das "Omada" device, reading "ITtagNetworkIds". Wo bekommt das Device "Omada" die Information her? Auch über "setreading"?
3. hab ich irgendwo was übersehen?
Vielen Dank und Grüße
Loopo
Mein Fehler:
tagNetworkIds": [%%ITdatatagNetworkIds%%],
Oh und ja!!! Den Zeitplan braucht man. Den habe ich ganz vergessen!
Habe von 00:00-24:00 Uhr eingestellt
So, jetzt hab ich es endlich hin bekommen.:
- Netzwerkprofil heißt "AllITPoe" und ist dem entsprechendem Port zugewiesen.
- In Omada gibt es einen POESchedule "AllITPoe", entsprechender Port ausgwählt. 0-24 Uhr
- das eine "replacement" angepasst:
replacement07Mode expression
replacement07Regex %%ITdatatagNetworkIds%%
replacement07Value ReadingsVal("OmadaDecode", "ITdatatagNetworkIds", "")
set01Data sieht jetzt erst mal so aus:
{
"site": "%%siteId%%",
"name": "%%ITdataname%%",
"poe": "$val",
"nativeNetworkId": "%%ITdatanativeNetworkId%%",
"untagNetworkIds": [],
"dot1x": 1,
"portIsolationEnable": false,
"lldpMedEnable": true,
"bandWidthCtrlType": 0,
"spanningTreeEnable": false,
"loopbackDetectEnable": false
}
sobald ich allerdings
"tagNetworkIds": [%%ITdatatagNetworkIds%%],
hinzufüge, geht es nicht mehr.
Reading im OmadaDecode spuckt folgendes aus: ITdatatagNetworkIds ""
Vielen Dank nochmal für Deine Hilfe!
Kannst du mal mit Verbose 5 ein get starten und den Output anschauen/Posten?
Sollte fast identisch mit dem Set01Data sein.
Was steht in OmadaDecode im Reading ITdatatagNetworkIds?
Den Log mit Verbose5 hab ich angehängt.
Readings für das PoE Profil:
result_data_02_bandWidthCtrlType: 0
result_data_02_dhcpL2RelaySettings_enable: 0
result_data_02_dot1x: 1
result_data_02_eeeEnable: 0
result_data_02_flag: 2
result_data_02_flowControlEnable: 0
result_data_02_id: 63c5b76d1b6c6334c9515557
result_data_02_lldpMedEnable: 1
result_data_02_loopbackDetectEnable: 0
result_data_02_loopbackDetectVlanBasedEnable: 0
result_data_02_name: AllITPoe
result_data_02_nativeNetworkId: 63597a63487df8426cbea0e5
result_data_02_poe: 0
result_data_02_portIsolationEnable: 0
result_data_02_site: 63597a63487df8426cbea0d9
result_data_02_spanningTreeEnable: 0
result_data_02_type: 2
Und die Readings aus dem OmadaDecoder:
IT: 02
ITdataid: 63c5b76d1b6c6334c9515557
ITdataname: AllITPoe
ITdatanativeNetworkId: 63597a63487df8426cbea0e5
ITdatatagNetworkIds: ""
state: active
triggeredByDev: OmadaSettingLanProfiles
triggeredByEvent: result_data_02_name: AllITPoe
Hab auch schon eine Vermutung: die "datatagNetworkIds" wird im Set Device nicht angezeigt, da kein Wert hinterlegt ist. Verschluckt er sich deswegen?
*Edit*
Ich hab jetzt mal ein Tag vergeben:
result_data_02_tagNetworkIds: 63597a63487df8426cbea0e7
result_data_02_tagNetworkIds_0: 63597a63487df8426cbea0e7
das reading im OmadaDecode bleibt aber unverändert:
ITdatatagNetworkIds: ""]
Wie sieht denn dein Profil im Omada aus?
Das native Netzwerk sollte tagged sein.
Aktuell ist das AllTIPoe wie folgt:
Native: CJBase
Tagged Networks:
Untagged Networks: CJBase
Voice Networks: None
Also wenn du ein Tagged vergeben hast, müsste das auch im Reading auftauchen.
Ärgerlich. Mach doch noch mal ein Update mit ,,get" und schau umso im Log was im log auftaucht.
Am besten du suchst nach CJBase und schaust dir mal den JSON Output an.
Dementsprechend müssen auch die Readings zurück kommen...
Hallo.
Aktuell nutze ich Ubiquiti Produkte in Verbindung mit den unifi Modul in Fhem.
Da bei Omada Produkten sowohl der Preis, die Verfügbarkeit und die Produktvielfalt besser ist überlege ich zu wechseln.
Hauptanwendungsfall ist bei die Anwesenheitserkennung.
Hat das schon mal jemand mit Omada realisiert?
Gruß
Daniel
Sollte einfach gehen:
Dummy Device
Internals:
NAME OmadaPresence
TYPE dummy
und ein notify:
DEF OmadaClients:result_data_[0-9]*_name.* {
my ($num) = $EVTPART0 =~ /([\d]+)/;
my ($active) = "result_data_".$num."_active";
my $presence = ReadingsVal("OmadaClients",$active,"");
my ($device) = "result_data_".$num."_name";
my $devname = ReadingsVal("OmadaClients",$device,"");
$devname=~s/ /_/g;
fhem("setReading OmadaPresence $devname $presence");
}
NAME notify_oc
NOTIFYDEV OmadaClients
REGEXP OmadaClients:result_data_[0-9]*_name.*
STATE 2023-03-17 12:03:43
TYPE notify
Hallo zusammen,
erstmal vielen Dank für tolle Arbeit, Zugriff auf den Omada Controller läuft damit direkt entsprechend der Beispiele.
Ich versuche gerade, auch das Presence Thema zum Laufen zu bringen, kriege aber das Modul für die Abfrage der Clients nicht hin, es kommt nur Error Code -1005 zurück, mit folgender Definition des Device:
define OmadaClients HTTPMOD https://controllerIP/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/clientList¤tPage=1¤tPageSize=1000 3600
attr OmadaClients enableControlSet 1
attr OmadaClients enableCookies 1
attr OmadaClients getHeader1 Content-Type: application/json
attr OmadaClients getHeader2 Csrf-Token: $sid
attr OmadaClients handleRedirects 0
attr OmadaClients reAuthAlways 1
attr OmadaClients reading100JSON mode
attr OmadaClients reading100Name mode
attr OmadaClients reading101JSON clientsDisplay
attr OmadaClients reading101Name clientsDisplay
attr OmadaClients reading102JSON errorCode
attr OmadaClients reading102Name errorCode
attr OmadaClients replacement01Mode expression
attr OmadaClients replacement01Regex %%omadacId%%
attr OmadaClients replacement01Value ReadingsVal("Omada", "result_omadacId", "")
attr OmadaClients replacement02Mode text
attr OmadaClients replacement02Regex %%apiVer%%
attr OmadaClients replacement02Value 2
attr OmadaClients replacement03Mode expression
attr OmadaClients replacement03Regex %%siteId%%
attr OmadaClients replacement03Value ReadingsVal("Omada", "result_Id", "")
attr OmadaClients requestHeader1 Content-Type: application/json
attr OmadaClients requestHeader2 Csrf-Token: $sid
attr OmadaClients room Omada
attr OmadaClients sid01Data {"username":"USER","password":"PASSWORD"}
attr OmadaClients sid01Header Content-Type: application/json
attr OmadaClients sid01IdJSON result_token
attr OmadaClients sid01URL https://controllerIP/%%omadacId%%/api/v%%apiVer%%/login
attr OmadaClients sslArgs SSL_VERIFY_NONE
attr OmadaClients stateFormat msg result_name
attr OmadaClients verbose 0
Habe ich da die falsche Reading Struktur? Ich finde für die API aber auch keine Doku zu den Fehlercodes...
Zitat von: mrnatcho am 06 August 2023, 13:21:00Hallo zusammen,
erstmal vielen Dank für tolle Arbeit, Zugriff auf den Omada Controller läuft damit direkt entsprechend der Beispiele.
Ich versuche gerade, auch das Presence Thema zum Laufen zu bringen, kriege aber das Modul für die Abfrage der Clients nicht hin, es kommt nur Error Code -1005 zurück, mit folgender Definition des Device:
define OmadaClients HTTPMOD https://controllerIP/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/clientList¤tPage=1¤tPageSize=1000 3600
attr OmadaClients enableControlSet 1
attr OmadaClients enableCookies 1
attr OmadaClients getHeader1 Content-Type: application/json
attr OmadaClients getHeader2 Csrf-Token: $sid
attr OmadaClients handleRedirects 0
attr OmadaClients reAuthAlways 1
attr OmadaClients reading100JSON mode
attr OmadaClients reading100Name mode
attr OmadaClients reading101JSON clientsDisplay
attr OmadaClients reading101Name clientsDisplay
attr OmadaClients reading102JSON errorCode
attr OmadaClients reading102Name errorCode
attr OmadaClients replacement01Mode expression
attr OmadaClients replacement01Regex %%omadacId%%
attr OmadaClients replacement01Value ReadingsVal("Omada", "result_omadacId", "")
attr OmadaClients replacement02Mode text
attr OmadaClients replacement02Regex %%apiVer%%
attr OmadaClients replacement02Value 2
attr OmadaClients replacement03Mode expression
attr OmadaClients replacement03Regex %%siteId%%
attr OmadaClients replacement03Value ReadingsVal("Omada", "result_Id", "")
attr OmadaClients requestHeader1 Content-Type: application/json
attr OmadaClients requestHeader2 Csrf-Token: $sid
attr OmadaClients room Omada
attr OmadaClients sid01Data {"username":"USER","password":"PASSWORD"}
attr OmadaClients sid01Header Content-Type: application/json
attr OmadaClients sid01IdJSON result_token
attr OmadaClients sid01URL https://controllerIP/%%omadacId%%/api/v%%apiVer%%/login
attr OmadaClients sslArgs SSL_VERIFY_NONE
attr OmadaClients stateFormat msg result_name
attr OmadaClients verbose 0
Habe ich da die falsche Reading Struktur? Ich finde für die API aber auch keine Doku zu den Fehlercodes...
Hi! Danke für das positive Feedback.
Probiere es doch mal mit:
https://controllerIP/%%omadacId%%/api/v%%apiVer%%/sites/%%siteId%%/clients?currentPage=1¤tPageSize=1000
Die API Doku gibts hier - stimmt aber nicht immer:
https://community.tp-link.com/en/business/forum/topic/590430 (https://community.tp-link.com/en/business/forum/topic/590430)
Thanks, mit der richtigen URL geht es auch (und der Korrektur der Tippfehler in meiner DEF und ein/zwei Attributen). Das Verbose hoch zu setzen und im Log zu schauen, wie die URL am Ende aussieht, war auch hilfreich.
Mit meiner Def kriege ich nun für jeden Client alle Felder als einzelne Readings, einfach durchnummeriert. Wie hast Du die Readings strukturiert? Mit RecombineExpr? Würdes Du die getreadings für Dein Modul zum Clients auslesen mal posten?
Hi,
nachdem ich auch nicht so der riesen Pearl Typ habe ich es mir einfach gemacht.
Ich habe nur folgende Attributes:
reading01DeleteIfUnmatched 1
reading01JSON result_data_[0-9]+_name
reading01Name name
Damit bekomme ich alle Namen bzw. Mac Adressen der Clients, wenn kein Name vergeben ist.
Durchnummeriert..
Nach ca. 5 Minuten abwesenheit verschwindet dann das Geräte aus OmadaClients. Weiß nicht ob dir das reicht...
Moin,
das funktioniert super, und reicht so vollkommen. Ich will damit auch nur Kameras im Eingangsbereich einschalten, wenn das Haus verlassen. Da reichen die 5 Minuten ja auch, ebenso bei der Heimkehr. Die Kameras sollen nur nicht durchgehend mitlaufen.