Modul: 74_UnifiSwitch - Auslesen und Steuern von UnifiSwitches (USW)

Begonnen von Wuehler, 12 Mai 2018, 00:37:44

Vorheriges Thema - Nächstes Thema

andies

#120
Ich scheine dasselbe Problem zu haben. Ich nutze den CloudKey Gen 2 und habe seit einem update keinen Zugriff mehr:
Internals:
   DEF        CloudKey.fritz.box 443 crypt:xxxx crypt:xxxxx 300
   FUUID      5e244be7-f33f-1115-db34-394dc6a8906d8bfd
   FVERSION   74_Unifi.pm:0.229620/2020-10-13
   NAME       Unifi
   NOTIFYDEV  global
   NR         255
   NTFY_ORDER 50-Unifi
   STATE      disconnected
   TYPE       Unifi
   UC_VERSION unknown
   VERSION    3.5.0
   READINGS:
     2020-12-29 13:41:48   -UC_blockedClients
     2020-12-29 13:41:48   -UC_events      392 (last 24h)
     2020-12-29 13:41:48   -UC_newClients 
     2020-12-29 13:41:48   -UC_unarchived_alerts 0
     2020-12-29 14:09:54   state           disconnected
   accespoints:
   alerts_unarchived:
   clients:
   events:
   helper:
     password   crypt:xxxx
     username   crypt:xxxxx
   hotspot:
     vouchers:
   httpParams:
     header     
     ignoreredirects 1
     loglevel   5
     method     POST
     noshutdown 0
     timeout    5
     hash:
     sslargs:
       SSL_verify_mode 0
   unifi:
     CONNECTED  disconnected
     eventPeriod 24
     interval   300
     ucurl      https://CloudKey.fritz.box/api/s/default/
     udmurl     https://CloudKey.fritz.box/proxy/network/api/s/default/
     url        https://CloudKey.fritz.box/api/s/default/
     customClientReadings:
       attr_value .:^accesspoint|^essid|^hostname|^last_seen|^snr|^uptime
       parts:
         0000000_part:
           ReadingRegEx ^accesspoint|^essid|^hostname|^last_seen|^snr|^uptime
           nameRegEx  .
   updateDispatch:
   wlans:
Attributes:
   group      intern
   isUDM      1

Sieht jemand, was da fehlt? Ich habe isUDM=1 gesetzt und den Port auf 443 geändert. Außerdem bin ich sehr unsicher, was genau User und Passwort ist - ich habe mehrere Versionen versucht. Kann man das auf der Webseite https://<cloudkey>/users/users/admins explizit irgendwo einstellen (ich habe bisher da den "superuser" genommen, aber auch da gibt es lokale Adressen wie auch Adressen mit Emails, etwas verwirrend, was man wann nehmen kann oder soll). 
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Wuehler

Moin andies,

welche Meldung kommt denn im Log?

Einen eigenen FHEM-User kannst du im Unifi-Controller unter Settings-> Admins anlegen. Je nachdem was du mit FHEM machst, reicht dann auch ein read-only-User. Aus Support-Sicht würde ich das aber nicht empfehlen, da man meistens nicht dran denkt, dass der User keine Rechte hat, wenn man mit dem Unifi-Modul aus FHEM heraus dann doch mal Änderungen in Unifi anstoßen möchte ;).

VG,
Dirk

andies

Zitat von: Wuehler am 30 Dezember 2020, 13:48:17
welche Meldung kommt denn im Log?

Danke für die Hilfe! Ich sehe das hier
2020.12.31 14:39:11 5: Unifi (Unifi_Notify) - executed.
2020.12.31 14:39:17 5: Unifi: get called with showAccount.
2020.12.31 14:39:25 5: Unifi: set called with update
2020.12.31 14:39:25 4: Unifi: set update
2020.12.31 14:39:25 5: Unifi (Unifi_DoUpdate) - executed.
2020.12.31 14:39:25 5: Unifi (Unifi_Login_Send) - executed.
2020.12.31 14:39:25 5: Unifi: get called with ?.
2020.12.31 14:39:25 5: Unifi (Unifi_Login_Receive) - executed.
2020.12.31 14:39:25 5: Unifi (Unifi_Login_Receive) - Login Failed! - state:'error.decode_json' - msg:'malformed JSON string, neither tag, array, object, number, string or atom, at character offset 1 (before "<!doctype html>\n<ht...") at ./FHEM/74_Unifi.pm line 917.
'
2020.12.31 14:39:25 5: Unifi (Unifi_Login_Receive) - Connect/Login to Unifi-Controller failed. Will try again after interval...
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Wuehler

Ah, das scheint ein Sonderzeichen im Namen (oder Passwort?) zu sein. Evtl. Klappt es, dies mit einem backslasch (\) zu escapen.

andies

Nein, habe ich nicht. Ich habe mal den Code verändert, um mehr Daten auszugeben:
sub Unifi_Login_Receive($) {
    my ($param, $err, $data) = @_;

    my ($name,$self,$hash) = ($param->{hash}->{NAME},Unifi_Whoami(),$param->{hash});
    Log3 $name, 5, "$name ($self) - executed.";
   
# Log3 $name, 5, "param code $param->{code}";
# Log3 $name, 5, "data encoded $data";
# Log3 $name, 5, "data decoded ".decode_json($data);

(jetzt auskommentiert) und dann ausgelesen. Beim reload der Datei gab es anscheinend einen Absturz mit Neustart,
2020.12.31 16:32:38 5: Unifi (Unifi_Notify) - executed.
2020.12.31 16:32:38 5: Unifi (Unifi_Notify) - executed.
2020.12.31 16:32:38 1: sduino: DoInit, ESP-Signalduino.fritz.box:23
2020.12.31 16:32:38 5: Unifi: get called with ?.
2020.12.31 16:32:40 5: Unifi (Unifi_Login_Receive) - executed.
2020.12.31 16:32:40 5: param code 200
2020.12.31 16:32:40 5: data encoded {
  "unique_id": "3d1dad2fxxxxxxxx",
  "first_name": "xx",
  "last_name": " ",
  "full_name": "xx  ",
  "email": "xx@xxx.xx",
  "email_status": "UNVERIFIED",
  "phone": "",
  "avatar_relative_path": "",
  "status": "ACTIVE",
  "employee_number": "",
  "create_time": 1609246116,
  "extras": {},
  "username": "ubnt",
  "local_account_exist": true,
  "password_revision": 1609247936,
  "sso_account": "",
  "sso_uuid": "",
  "sso_username": "",
  "sso_picture": "",
  "uid_sso_id": "",
  "uid_sso_account": "",
  "groups": [
    {
      "unique_id": "03ffcac8-xxxxxxxxxxx",
      "name": "CloudKey",
      "up_id": "",
      "up_ids": [],
      "system_name": "CloudKey",
      "create_time": "2020-12-29T12:52:08+01:00"
    }
  ],
  "roles": [
    {
      "unique_id": "530ee3ee-xxxxxxxx",
      "name": "Super Administrator",
      "system_role": true,
      "system_key": "super_administrator",
      "level": 2
    }
  ],
  "permissions": {
    "access.management": [
      "admin"
    ],
    "connect.management": [
      "admin"
    ],
    "led.management": [
      "admin"
    ],
    "network.management": [
      "admin"
    ],
    "protect.management": [
      "admin"
    ],
    "system.management.location": [
      "admin"
    ],
    "system.management.user": [
      "admin"
    ],
    "talk.management": [
      "admin"
    ]
  },
  "scopes": [
    "write:protect.viewer",
    "write:protect.user",
    "write:protect.sensor",
    "write:protect.recordingSchedule",
    "write:protect.nvr",
    "write:protect.light",
    "write:protect.group",
    "write:protect.camera",
    "write:protect.bridge",
    "view:user_timezone",
    "view:user",
    "view:systemlog",
    "view:settings",
    "view:role",
    "view:permission:viewer",
    "view:permission:admin",
    "view:permission",
    "view:notification",
    "view:location_policy",
    "view:location_device",
    "view:location_activity",
    "view:location",
    "view:holiday_timezone",
    "view:holiday",
    "view:group",
    "view:door_group",
    "view:controller:talk",
    "view:controller:protect",
    "view:controller:network",
    "view:controller:led",
    "view:controller:connect",
    "view:controller:access",
    "view:cloud_access",
    "view:app:users",
    "view:app:settings",
    "view:app:locations",
    "view:access.visitor",
    "view:access.systemlog",
    "view:access.settings",
    "view:access.schedule",
    "view:access.policy",
    "view:access.pin_code",
    "view:access.nfc_card",
    "view:access.face",
    "view:access.device",
    "view:access.dashboard",
    "update:access.device",
    "systemlog:user",
    "systemlog:system",
    "systemlog:location",
    "systemlog:access",
    "readmedia:protect.camera",
    "read:protect.viewer",
    "read:protect.user",
    "read:protect.sensor",
    "read:protect.recordingSchedule",
    "read:protect.nvr",
    "read:protect.light",
    "read:protect.group",
    "read:protect.camera",
    "read:protect.bridge",
    "open:door",
    "notify:user",
    "notify:location",
    "notify:access",
    "manage:controller:talk",
    "manage:controller:network",
    "manage:controller:led",
    "manage:controller:connect",
    "manage:controller:access",
    "edit:user_timezone",
    "edit:user",
    "edit:systemlog",
    "edit:settings",
    "edit:role",
    "edit:permission:viewer",
    "edit:permission:admin",
    "edit:notification",
    "edit:location_policy",
    "edit:location_device",
    "edit:location_activity",
    "edit:location",
    "edit:holiday_timezone",
    "edit:holiday",
    "edit:group",
    "edit:feedback",
    "edit:door_group",
    "edit:access.visitor",
    "edit:access.settings",
    "edit:access.schedule",
    "edit:access.policy",
    "edit:access.pin_code",
    "edit:access.nfc_card",
    "edit:access.face",
    "edit:access.device",
    "deletemedia:protect.camera",
    "delete:protect.viewer",
    "delete:protect.user",
    "delete:protect.sensor",
    "delete:protect.recordingSchedule",
    "delete:protect.nvr",
    "delete:protect.light",
    "delete:protect.group",
    "delete:protect.camera",
    "delete:protect.bridge",
    "delete:access.device",
    "create:protect.viewer",
    "create:protect.user",
    "create:protect.sensor",
    "create:protect.recordingSchedule",
    "create:protect.liveview",
    "create:protect.light",
    "create:protect.group",
    "create:protect.camera",
    "create:protect.bridge",
    "assign:role",
    "adopt:access.device"
  ],
  "cloud_access_granted": false,
  "update_time": 1609247936,
  "avatar": "",
  "nfc_token": "",
  "nfc_display_id": "",
  "nfc_card_type": "",
  "nfc_card_status": "",
  "id": "3d1dad2f-xxxxxxxxxxxxxx",
  "isOwner": false,
  "isSuperAdmin": true
}
2020.12.31 16:32:40 5: data decoded HASH(0x77bb820)
2020.12.31 16:32:40 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/74_Unifi.pm line 924.

danach ging es anscheinend durch
2020.12.31 16:32:40 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/74_Unifi.pm line 924.
2020.12.31 16:32:40 5: Unifi (Unifi_Login_Receive) - state=ok
2020.12.31 16:32:40 5: Unifi (Unifi_Login_Receive) - Login successfully!  Cookie: TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjc3JmVG9rZW4iOiIwMTlmMDM1OS05ZTJjLTRlOWQtODA3NC1lNTZjOGRkNjEwYzciLCJ1c2VySWQiOiIzZDFkYWQyZi01ODVhLTRiMTAtYjI2Yy1mMjhiMmJiYTc2NDQiLCJyZW1lbWJlck1lIjp0cnVlLCJpc1JlbWVtYmVyZWQiOnRydWUsImlhdCI6MTYwOTQyODc1OSwiZXhwIjoxNjEyMDIwNzU5fQ.WVFVo1EYYr0R0v8iqxAjDkJppHknLAt6GvtZOU2f9cU;
2020.12.31 16:32:40 5: Unifi (Unifi_GetSysinfo_Send) - executed.
2020.12.31 16:32:40 5: Unifi (Unifi_UsergroupRestJson_Send) - executed.
2020.12.31 16:32:41 1: [YAAHM_updater] on device Profil called for this day
2020.12.31 16:32:41 1: PERL WARNING: Use of uninitialized value in string comparison (cmp) at ./FHEM/95_YAAHM.pm line 285.
2020.12.31 16:32:41 5: Unifi (Unifi_UsergroupRestJson_Receive) - executed.
2020.12.31 16:32:41 5: Unifi (Unifi_UsergroupRestJson_Receive) - state:'ok'
2020.12.31 16:32:41 5: Unifi (Unifi_GetSysinfo_Receive) - executed.
2020.12.31 16:32:41 5: Unifi (Unifi_GetSysinfo_Receive) - state:'ok'
2020.12.31 16:32:41 5: Unifi (Unifi_GetSysinfo_Receive) - uc_version: 6.0.43
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Roger

Hi Wuehler,
danke für das schöne Modul für Unifi-Infrastruktur. Ich habe seit kurzem zwei WLAN-APs von Unifi.
Kannst Du noch ein paar Readings ins Modul bzgl. der Firmware-Versionen einbauen?
Speziell version und upgrade_to_firmware für jeden WLAN-AP?
Dann kann man sehen und triggern, wenn was zu tun ist.
Ich habe das zwar mit get deviceData hinbekommen, aber es ist bestimmt für alle nützlich.

Seit gestern habe ich auch einen Hinweis, das die Version 6.0.45 für den Unifi Network Controller verfügbar ist.
Gibt es diese Info auch in den JSON-Daten? Ich habe nichts gefunden.
Auch hier wäre ein Reading über einen Update nützlich.

//Roger
Zotac, BBB, RPIs mit 10*FHEM
2*HM-LAN, 2*JeeLink, 2*RS485, SignalESP
HomeMatic, PCA301 Komponenten, ModBus: Stromzähler, Fronius WR, Shelly

Wuehler

Hallo Roger,

seit dem letzten Update des Moduls gibt es ein get deviceData. Damit kannst du dir für die APs eigene userreadings anlegen. Ich habe nicht vor, alle möglichen Werte für jeden User als Reading zur Verfügung zu stellen. Das wäre dann eine sehr lange Liste ;)


Müsste ungefähr folgendermaßen aussehen.
am Unifi-Device:

attr Unifi userReadings myUsgMem:-AP-lastUpdate.* {my $json=fhem("get Unifi deviceData usg");;return getUnifiJsonValue($json,"system-stats","mem","");;}

in myUtils:


use JSON qw(decode_json);

...

# Hilfsfunktion für das Anlegen von Userreadings im Unifi-Device
# Nicht vollständig generisch!
# Array-Inhalte können nicht abgefragt werden, dann ggf. spezifische myUtils-Funktion erstellen.
# Oder bei echtem Bedarf so etwas wie Json-Querys nutzen?!
# Beispielaufruf: getUnifiJsonValue($json,"system-stats","mem","")
sub getUnifiJsonValue($$$$){
  my ($json,$a,$b,$c) = @_;
  my $hash=decode_json($json);
  my $obj=$hash->{$a};
  $obj=$obj->{$b} if $b ne "";
  $obj=$obj->{$c} if $c ne "";
  return $obj;
}


Wenn man die echten FHEM- und/oder Perl-Experten fragt bekommt man bestimmt noch eine elegantere Lösung ggf. auch ohne myUtils ;)

Hier gibt es noch das TODO, das Ganze im WIKI zu beschreiben. Das würde ich aber  gerne aus einem echten UseCase und funktionierenden übernehmen. Also gerne die Lösung hier dann posten  :)



Für update_available des Controllers selbst müsste ich eine Anpassung vornehmen. Grundsätzlich kennt das Modul sogar die Information, allerdings wird die Sys-Info-API nur beim Define/FHEM-Neustart einmalig automatisch aufgerufen, kann aber manuell (oder per at) aktualisiert werden. Ich würde dann eine "get SysData" anbieten und du könntest aus dem at (mit etwas Wartezeit)  eine Information senden / Reading updaten).

Viele Grüße,
Dirk

Roger

Guten Abend Dirk,
wie ich sage - mit get deviceData habe ich das hinbekommen, wenn auch nicht so elegant wie Du --> ich werde versuchen Deine Lösung zu verstehen und zu übernehmen. Dachte eben nur Firmewareupdates sind für alle wichtig  :).

"get SysData" für Informationen vom Controller (wenn auch über at getriggert) wäre toll  :D.

//Roger
Zotac, BBB, RPIs mit 10*FHEM
2*HM-LAN, 2*JeeLink, 2*RS485, SignalESP
HomeMatic, PCA301 Komponenten, ModBus: Stromzähler, Fronius WR, Shelly

Wuehler

Guten Morgen,

oh, sorry den einen Satz habe ich überlesen  :-[
Kannst auch gerne deine Lösung posten.
Unifi ist so umfangreich, da kann sehr vieles für alle nützlich sein. Andererseits gibt es auch viele, die nur einen kleinen Teil mit Hilfe von FHEM automatisieren wollen. Die würden dann von der Masse an Readings erschlagen.
Man kann theoretisch alles, was über das Unifi-Controller-Frontend geht, auch in das FHEM-Unifi-Modul übernehmen. Problem dabei ist nur, dass alles gepullt werden muss und das dann schon recht viel Last erzeugt. Daher mache ich die Sys-Info Abfrage nicht im normalen Update-Intervall.

Das get sysData schaue ich mir in einer ruhigen Minute an.

Viele Grüße,
Dirk

andasquared

Guten Morgen,

ich bin vor kurzem mit meiner Unifi Umgebung auf eine UDM-Pro umgezogen.
seit dem kann ich auch den PoE Mode meiner Ports über Fhem nicht mehr setzen.

habe gesehen, ihr habt das hier schon angesprochen.
habt ihr dafür schon eine Lösung gefunden?

mein UniFi Device hat das attr isUDM=1 gesetzt.
meine UniFiSwitch Devices habe ich auch schon gelöscht und über Autocreate neu anlegen lassen.
kann alle Readings sehen nur kann ich den PoEMode der Ports nicht ändern.
in den Logs finde ich keine Fehler - auch mit Verbose=5


defmod UniFi Unifi aaa.bbb.ccc.ddd 443 crypt:xxxxxx crypt:xxxxxxxxxxxxxx 60
attr UniFi DbLogExclude .*
attr UniFi disable 0
attr UniFi event-on-change-reading .*
attr UniFi isUDM 1
attr UniFi room UniFi



defmod US_USPRO_48PoE UnifiSwitch US_USPRO_48PoE
attr US_USPRO_48PoE DbLogExclude .*
attr US_USPRO_48PoE room UnifiSwitch
attr US_USPRO_48PoE verbose 5



set US_USPRO_48PoE poeMode 1 off
set US_USPRO_48PoE poeMode 1 auto
set US_USPRO_48PoE poeMode 1 restart


im Log sehe ich das:


2021.03.15 09:18:06 5: US_USPRO_48PoE: set called with poeMode 1 off
2021.03.15 09:18:06 4: US_USPRO_48PoE: set poeMode
2021.03.15 09:18:10 5: US_USPRO_48PoE: set called with poeMode 1 auto
2021.03.15 09:18:10 4: US_USPRO_48PoE: set poeMode
2021.03.15 09:18:14 5: US_USPRO_48PoE: set called with poeMode 1 restart
2021.03.15 09:18:14 4: US_USPRO_48PoE: set poeMode


in UniFi tut sich leider nichts.
der Benutzer ist ein localAdmin User auf der UniFi Seite.
mit diesem Benutzer kann ich dort einsteigen und direkt in UniFi die Ports ändern.

hättet ihr eine Idee?

Lg
AndaSquared

Mitch

Wie kann man denn den Autocreate der Switche daektivieren?
FHEM im Proxmox Container

andasquared

ich habe Autocreate normalerweiswe deaktiviert und den UnifiSwitch händisch angelegt.
wollte damit nur sagen, dass ich es gelöscht habe und über Autocreate neu erstellt habe.

wenn hier das attr disable 1 gesetzt ist, dann wird der UnifiSwitch nicht automatisch angelegt:

defmod autocreate autocreate
attr autocreate DbLogExclude .*
attr autocreate disable 1


das hab ich auf 0 gesetzt, meinen händisch angelegten UnifiSwitch gelöscht und er wurde dann über autocreate neu angelegt.

Mitch

globaler Autocreate ist klar, ich würde es gerne auf Modulebene machen.

Was mir gerade dazu noch aufgefallen ist, man kann nicht bei autocreate ignoreTypes setzten, weil die Namen der Switche "falsch" erzeugt werden.
Wenn schon autocreate, dann bitte so: Switch_xxxx
FHEM im Proxmox Container

andasquared

läuft das bei irgendjemanden mit UDMPro?
ich habe bei mir an Fhem auch KNX angebunden - und habe früher über einen Taster das Ein-/Ausschalten meiner AccessPoints gesteuert.
vielleicht muss ich ja auf UDMPro Seite noch was anpassen?

ev. hat ja jemand von euch mit UDMPro schon was zusammengebracht.

Danke!
lg

Freibeuter

Hallo, bei mir klappt es mit dem POE udn der UDM Pro auch leider noch nicht...
Hat noch jemand da sProblem, dass bei mehreren unifi Sites, die UnifiSwitch das falsche IODev haben, wie kann ich das manuell ändern ?