Modul für Omada SDN Controller

Begonnen von MatthiasL, 30 September 2022, 15:43:08

Vorheriges Thema - Nächstes Thema

MatthiasL

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.

MatthiasL

Habe es nun letztlich mit HTTPMOD gelöst.
Ist zwar ein bisschen unschön, aber funktioniert.

Bei Interesse - einfach melden.

Supadone

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

MatthiasL

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?

Supadone

Das wär super :)

Ich habe den OC200 2.0 mit 5.5.7

MatthiasL

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.

Supadone

#6
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

MatthiasL

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&currentPageSize=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..

Supadone

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

MatthiasL

#9
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%%

KOAL

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&currentPageSize=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
1X DEBAIN 11 ESXI VM, Openvpn-Server, FHEM, DHCP, HM-LAN W, USB-Enocean, Smartvisu V3.X
1X UBUNU 20.X LTS ESXI VM, AUTO-SERVER, Openvpn-Backup Server
1X UBUNU 20.X LTS ESXI VM, MAILSERVER, CLOUD
1X Lockerstor 4, NAS + APC CS650
1X WIN-10 ESXI VM, BLUEIRIS CAM Server

MatthiasL

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.

MatthiasL

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

KOAL

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
1X DEBAIN 11 ESXI VM, Openvpn-Server, FHEM, DHCP, HM-LAN W, USB-Enocean, Smartvisu V3.X
1X UBUNU 20.X LTS ESXI VM, AUTO-SERVER, Openvpn-Backup Server
1X UBUNU 20.X LTS ESXI VM, MAILSERVER, CLOUD
1X Lockerstor 4, NAS + APC CS650
1X WIN-10 ESXI VM, BLUEIRIS CAM Server

MatthiasL

IP:Port bitte immer durch echt Werte ersetzen.
Und Replacement02Value ApiVer 2! Nicht 3!

Supadone

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

KOAL

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
1X DEBAIN 11 ESXI VM, Openvpn-Server, FHEM, DHCP, HM-LAN W, USB-Enocean, Smartvisu V3.X
1X UBUNU 20.X LTS ESXI VM, AUTO-SERVER, Openvpn-Backup Server
1X UBUNU 20.X LTS ESXI VM, MAILSERVER, CLOUD
1X Lockerstor 4, NAS + APC CS650
1X WIN-10 ESXI VM, BLUEIRIS CAM Server

MatthiasL

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.

MatthiasL

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.

MatthiasL

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

KOAL

Danke,
werd ich versuchen sobald ich wieder gesund bin :)


super Hilfe bisher :) :)
LG
KOAL
1X DEBAIN 11 ESXI VM, Openvpn-Server, FHEM, DHCP, HM-LAN W, USB-Enocean, Smartvisu V3.X
1X UBUNU 20.X LTS ESXI VM, AUTO-SERVER, Openvpn-Backup Server
1X UBUNU 20.X LTS ESXI VM, MAILSERVER, CLOUD
1X Lockerstor 4, NAS + APC CS650
1X WIN-10 ESXI VM, BLUEIRIS CAM Server

Loopo

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

MatthiasL

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.

MatthiasL

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&currentPageSize=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&currentPageSize=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...

Loopo

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.

Loopo

#25
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

MatthiasL

#26
Mein Fehler:
tagNetworkIds": [%%ITdatatagNetworkIds%%],

MatthiasL

Oh und ja!!! Den Zeitplan braucht man. Den habe ich ganz vergessen!
Habe von 00:00-24:00 Uhr eingestellt

Loopo

#28
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!

MatthiasL

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?

Loopo

#30
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: ""]

MatthiasL

Wie sieht denn dein Profil im Omada aus?
Das native Netzwerk sollte tagged sein.

Loopo

Aktuell ist das AllTIPoe wie folgt:

Native: CJBase
Tagged Networks:
Untagged Networks: CJBase
Voice Networks: None

MatthiasL

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...

WhyTea

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

MatthiasL

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

mrnatcho

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&currentPage=1&currentPageSize=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...
FHEM auf Ubuntu Server VM auf Synology NAS, Yamaha MC's, Technoline Temperatur-Sensoren über Lacrosse GW's, HM-IP Devices über virtual CCU aus Raspberry Pi

MatthiasL

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&currentPage=1&currentPageSize=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&currentPageSize=1000

Die API Doku gibts hier - stimmt aber nicht immer:
https://community.tp-link.com/en/business/forum/topic/590430

mrnatcho

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?
FHEM auf Ubuntu Server VM auf Synology NAS, Yamaha MC's, Technoline Temperatur-Sensoren über Lacrosse GW's, HM-IP Devices über virtual CCU aus Raspberry Pi

MatthiasL

#39
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...

mrnatcho

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.
FHEM auf Ubuntu Server VM auf Synology NAS, Yamaha MC's, Technoline Temperatur-Sensoren über Lacrosse GW's, HM-IP Devices über virtual CCU aus Raspberry Pi