Ubiquiti - Unifi AP ClientListe

Hallo Spoosie,

vielen Dank! Hab gerade meinen zweiten UAP-PRO bekommen und war sehr überrascht, als ich UBIQUITI in die Suche eingab und Dein Skript fand! Super… Werde es direkt morgen früh einbauen! :slight_smile:

Du hast nicht zufällig eine Idee, wie man die APs abschalten kann? Würde gerne einen AP an den Kinderzimmern ab 22:00 abschalten. Nach ersten Recherchen scheint dies nur über ein SSH Kommando zu gehen!?

Hallo Andreas,

das kannst Du auch in der Controller-Software einstellen. Settings/Wireless Networks/Dein Netzwerk/Advanced Options - dort kannst Du einen Zeitplan pflegen.

LG Tom

Hi,

da hatte ich schon mal gesucht… Da ist bei mir nichts zu finden?!

Da kann ich lediglich das VLAN einstellen, SSID verstecken usw… :confused:

edit:

Controller Version 3.2.10

hallo
geht bei euch auch seit dem update auf 3.2 12.2920 das Skript nicht mehr
wenn ja hat wer ne Lösung warum oder was angepasst werden muss
machte das update von 3.2.1.2601 ggf wurde irgendwas dazwischen anders

gruss Roman

Vielleicht braucht es jetzt die Anpassung für den 4er Zweig der Software? Details siehe weiter vorn…

Hallo,

muß für eine Voucher-Lösung immer ein PC mit der Controller-Software laufen?

Ich hatte den PC aus und es war free4all :eek:

Mach ich was falsch?

Grüße, Done

PS: ist wohl so:
UniFi APs can run by themselves without the controller unless features like guest portal is enabled

ja das wars
besten Dank
läuft wieder

gruss Roman

Hi,

ich bekomme es nicht zum laufen.

Frage: Das Passwort und der Username in der unifi.php muß ich das ändern (mein admin-Passwort) oder bleibt ubnt/ubnt?

Bei mir kommt in beiden Fällen beim Ausführen des scrits die Meldung:

 
Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\21876.ips.php on line 47

Warning:  Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\21876.ips.php on line 47

Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\21876.ips.php on line 136

Warning:  Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\21876.ips.php on line 136

Warning:  Objekt #20082 existiert nicht in C:\IP-Symcon\scripts\21876.ips.php on line 153

Geht um die $Clientlist

Irgend ne Idee?

hardlog

Abend!

Kenne das Skript jetzt nicht, aber

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\21876.ips.php on line 47

…klingt nach json. Und wenn du „Client Liste“ erwähnst, dann kommen mir als erstes die Umlaute/Sonderzeichen in den Sinn.
Und die Fehler mit dem „foreach“ wären dann Folgefehler, weil bei json ein NULL raus kam, wegen möglicher Umlaute/Sonderzeichen…

Grüße,
Chris

Bin gerade in Schweden. Guck mir das an, sobald ich wieder zuhause bin.

Gruss Kevin

Bei mir hat es out of the box funktioniert. Du musst natürlich Usernamen und Passwort anpassen!

Gruß
Andreas

Bei mir läuft das Script sauber durch, allerdings steht in der Ausgabe das aktuell keine Clients verbunden sind.
Im Controller selber sind es dann aber 11 Clients.
Änderungen sind eingepflegt.

Loerdy

Hast du evtl. eine andere Version als ich laufen? Ubiquiti hat da gerade ne 4er Version im Test - evtl. schon released. Ich hab noch die 3er.

Ich habe meine APs erst seit einer Woche und die aktuelle Controllersoftware runtergeladen.
Diese hat die Version 4.6.6. Die Änderungen zur Version 4.2 hier aus diesem Thema habe ich durchgeführt.

Gruß,
Loerdy

Das Phänomen hatte ich auch, bis ich Username, Passwort angepasst hatte!

Die Version 4.6.6 sollte grundsätzlich funktionieren…

Hi Leute ,

ich bin auch auf der 4.6.0 und bekomm es nicht zum laufen.

mein Abfrage :


 <?
// V1.00    07.01.2015 - Erstes Release

// Mit diesem Skript können die Daten der an den Unifi APs angemeldeten Clients
// abgerufen werden.
//
//  © by Kevin Heidrich 2015
//            kevinheidrich@me.com
//  Web: www.kh-solutions.de
//
//Vorgehensweise:
//
// - String Variable für die Ausgabe im Webfront anlegen und ID in der Config unten eintragen

$htmlBoxID = 40337  /*[Geräte\Unifi WLan\Content]*/;

// Optional können noch die nächsten Tabellen gepflegt werden.
//
// Eine Lockup Tabelle für nicht ermittelbare Gerätenamen pflegen
// Über den Parameter "PresentVarID" wird eine bool Variable mit dem aktuellen
// Verfügbarkeitsstatus befüllt. Evtl. sinnvoll für Anwesenheitserkennung über das
// Handy.

$macList = array(
            array("Name" => "Sonos Play5", "MAC" => "b8:e9:37:22:3a:85"),
            //array("Name" => "iMac", "MAC" => "de:ad:be:ef:fe:ed"),
            array("Name" => "iPhone Marcel", "MAC" => "70:3e:ac:07:c1:3f", "PresentVarID" => 15995  /*[Geräte\Unifi WLan\iPhone Marcel]*/),
            array("Name" => "iPhone Lilly", "MAC" => "88:1f:a1:c0:a3:1f", "PresentVarID" => 28131  /*[Geräte\Unifi WLan\iPhone Lilly]*/),
            );

// Eine weitere Lockup Tabelle für die Accesspoints und deren Alias.
$apList = array(
            array("Name" => "Buero", "MAC" => "04:18:d6:10:1f:ca"),
            array("Name" => "Balkon", "MAC" => "04:18:d6:9a:62:36"),
            // array("Name" => "Garten", "MAC" => "de:ad:be:ef:fe:ed"),
            );


// ----------------------------------------------------------------------------------
// Ab hier dann bitte nichts mehr ändern
// ----------------------------------------------------------------------------------
include "unifi.php";

$clientList = Unifi_GetClients();

$scriptResult = "";

foreach($clientList->data as $client)
{

    $scriptResult .= "<tr style='height:20px;font-size:12px;'>";

    // Name über MACNummer rausfinden.
    // Nicht alle Geräte senden anständig ihren Namen mit. Deswegen über Liste arbeiten
    $clientName = "";
    foreach($macList as $key => $entry)
       if ($entry["MAC"] == $client->mac)
        {
            $clientName = $entry["Name"];
            break;
        }

    // War nicht in Liste!
    if ($clientName == "")
            $clientName = $client->hostname;

    $scriptResult .= "<td>".$clientName."</td>";

    $scriptResult .= "<td style='text-align:center'>".$client->mac."</td>";
    $scriptResult .= "<td style='text-align:center'>".$client->ip."</td>";

    // Accesspoints übersetzen
    $apName = "";

    foreach($apList as $ap)
       if ($ap["MAC"] == $client->ap_mac)
       {
            $apName = $ap["Name"];
            break;
        }

    // War nicht in Liste!
    if ($apName == "")
        $apName = $client->ap_mac;

    $scriptResult .= "<td style='text-align:center'>$apName</td>";
    $scriptResult .= "<td style='text-align:center'>".$client->essid."</td>";
    $scriptResult .= "<td style='text-align:center'><div style='width:100%;height:20px;overflow:hidden;'>";

    // Pegelumwandlung - Entspricht leider nicht dem Wert in der Webconsole. Kein Plan wie die das berechnen
    /* 100% -35 / 50% -65 / 1% -95 */
    if ($client->signal <= -95)
        $percent = 1;
    else if ($client->signal >= -35)
       $percent = 100;
    else
        $percent = round(($client->signal + 95) / 0.6);

    if ($percent < 10)
        $levelImg = "0";
    else if ($percent <= 20)
        $levelImg = "1";
    else if ($percent <= 40)
        $levelImg = "2";
    else if ($percent <= 60)
        $levelImg = "3";
    else if ($percent <= 80)
        $levelImg = "4";
    else
        $levelImg = "5";

    $scriptResult .= "<img src='user/img/level/level$levelImg.png'> $percent% (Ch.".$client->channel.") ";

    if ($client->is_11a)
           if ($client->radio_proto == "a")
        $scriptResult .= "a";
    else if ($client->radio_proto == "ac")
        $scriptResult .= "ac";
    else if ($client->radio_proto == "b")
        $scriptResult .= "b";
    else if ($client->radio_proto == "ng")
        $scriptResult .= "n";
    else if ($client->radio_proto == "g")
        $scriptResult .= "g";
    else
        $scriptResult .= "g";

    $scriptResult .= "</div></tr>";

}

// ------------------------------------------------
// Anwesenheitserkennung (Testinstallation)
// ------------------------------------------------
foreach($macList as $key => $entry)
{
      $macList[$key]["Present"] = false;
}

foreach($clientList->data as $client)
{

    // Name über MACNummer rausfinden.
    // Nicht alle Geräte senden anständig ihren Namen mit. Deswegen über Liste arbeiten
    $found = false;
    foreach($macList as $key => $entry)
    {
       if ($entry["MAC"] == $client->mac)
          $macList[$key]["Present"] = true;
    }
}

foreach($macList as $key => $entry)
{
    // Nur einen Wert setzen, wenn auch ein Target vorhanden ist
    if (isset($entry["PresentVarID"]))
        SetValue($entry["PresentVarID"],$entry["Present"]);
}

// ------------------------------------------------
// ------------------------------------------------

$htmlBox = "";
$htmlBox .= "<table style='width:100%;font-size:14px;'>";
$htmlBox .= "<tr><td style='text-align:left;font-size:12px;' colspan='10'>Letzte Aktualisierung: ".date("H:i:s d.m.Y")."</td></tr>";
$htmlBox .= "<tr style='height:1px;'><td style='background-color:#aaaaaa;' colspan='10'></td></tr>";

if ($scriptResult == "")
    $htmlBox .= "<tr><td style=''>Keine Clients im WLAN</td></tr>";
else
{
   $htmlBox .= "<tr><th>Name</th><th>MAC</th><th>IP</th><th>AP</th><th>WLAN</th><th>Pegel</th></tr>";
    $htmlBox .= $scriptResult;
}

SetValue($htmlBoxID,$htmlBox);

?>

meine unifi.php



$username="testips";
$password="testips!";
$baseurl="https://192.168.178.3:8443";

function Unifi_GetClients()
{
    global $username;
	global $password;
	global $baseurl;

    # init curl object and set session-wide options
    $ch = curl_init();

 	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/unifi_cookie");
    curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/unifi_cookie");
    curl_setopt($ch, CURLOPT_SSLVERSION, 1); //set TLSv1 (SSLv3 is no longer supported)

    
    # authenticate against unifi controller
    #curl_setopt($ch, CURLOPT_URL, "$baseurl/login");
    curl_setopt($ch, CURLOPT_URL, "$baseurl/api/login");
    curl_setopt($ch, CURLOPT_POST, 1);
    #curl_setopt($ch, CURLOPT_POSTFIELDS, "login=login&username=$username&password=$password");
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array("username" => $username, "password" => $password)).":");

	# client stats
    curl_setopt($ch, CURLOPT_URL, "$baseurl/api/s/default/stat/sta");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "json={}");
    $response = curl_exec ($ch);

    # logout
    curl_setopt($ch, CURLOPT_URL, "$baseurl/logout");
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_POSTFIELDS, NULL);
    curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
    curl_exec ($ch);

    curl_close ($ch);
    unset($ch);


    if ($response !== false) {
        return json_decode($response);
    } else {
        return 0;
    }
}

Als ergebniss kommt : Keine Clients :frowning:

Benutzername und Kennwort sind richtig.
Trage ich falsche ein läuft das Script auf einen Fehler.

Gruß,
Loerdy

Jetzt läuft es , der Vollständigkeit halber :

die Funktionierende unifi.php


<?

$username="ipsymcon";
$password="ipsymcon";
$baseurl="https://192.168.178.3:8443";

function Unifi_GetClients()
{
    global $username;
	global $password;
	global $baseurl;

    # init curl object and set session-wide options
    $ch = curl_init();

 	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/unifi_cookie");
    curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/unifi_cookie");
    curl_setopt($ch, CURLOPT_SSLVERSION, 1); //set TLSv1 (SSLv3 is no longer supported)

    # authenticate against unifi controller
    #curl_setopt($ch, CURLOPT_URL, "$baseurl/login");
    curl_setopt($ch, CURLOPT_URL, "$baseurl/api/login");
    curl_setopt($ch, CURLOPT_POST, 1);
    #curl_setopt($ch, CURLOPT_POSTFIELDS, "login=login&username=$username&password=$password");
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array("username" => $username, "password" => $password)).":");
    curl_exec ($ch);

	# client stats
    curl_setopt($ch, CURLOPT_URL, "$baseurl/api/s/default/stat/sta");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "json={}");
    $response = curl_exec ($ch);

    # logout
    curl_setopt($ch, CURLOPT_URL, "$baseurl/logout");
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_POSTFIELDS, NULL);
    curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
    curl_exec ($ch);

    curl_close ($ch);
    unset($ch);


    if ($response !== false) {
        return json_decode($response);
    } else {
        return 0;
    }
}

/*

Todo!

function Unifi_AuthorizeDevice($mac, $minutes = 1440, $rateup = 512, $ratedown = 2048, $MBlimit = 150)
{
    global $username;
	global $password;
	global $baseurl;

    # init curl object and set session-wide options
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/unifi_cookie");
    curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/unifi_cookie");
    curl_setopt($ch, CURLOPT_SSLVERSION, 1); //set TLSv1 (SSLv3 is no longer supported)

    # authenticate against unifi controller
    curl_setopt($ch, CURLOPT_URL, "$baseurl/login");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "login=login&username=$username&password=$password");
    curl_exec ($ch);

    # authorize a guest for $minutes with $rateup/$ratedown bandwidth limits and $MBlimit max transfer
    curl_setopt($ch, CURLOPT_URL, "$baseurl/api/s/default/cmd/stamgr");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "json={'cmd':'authorize-guest', 'mac':'$mac', 'minutes':$minutes, 'up':$rateup, 'down':$ratedown, 'bytes':$MBlimit}");
    $response = curl_exec ($ch);

    # logout
    curl_setopt($ch, CURLOPT_URL, "$baseurl/logout");
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_POSTFIELDS, NULL);
    curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
    curl_exec ($ch);

    curl_close ($ch);
    unset($ch);

    if ($response !== false) {
        return $response;
    } else {
        return 0;
    }
}
*/
?>


meine unifi Abfrage :


<?
// V1.00    07.01.2015 - Erstes Release

// Mit diesem Skript können die Daten der an den Unifi APs angemeldeten Clients
// abgerufen werden.
//
//  © by Kevin Heidrich 2015
//            kevinheidrich@me.com
//  Web: www.kh-solutions.de
//
//Vorgehensweise:
//
// - String Variable für die Ausgabe im Webfront anlegen und ID in der Config unten eintragen

$htmlBoxID = 40337  /*[Geräte\Unifi WLan\Content]*/; // bitte eine anlegen

// Optional können noch die nächsten Tabellen gepflegt werden.
//
// Eine Lockup Tabelle für nicht ermittelbare Gerätenamen pflegen
// Über den Parameter "PresentVarID" wird eine bool Variable mit dem aktuellen
// Verfügbarkeitsstatus befüllt. Evtl. sinnvoll für Anwesenheitserkennung über das
// Handy.

$macList = array(
            array("Name" => "Sonos Play5", "MAC" => "b8:e9:37:22:3a:81"),
                        array("Name" => "iPhone Marcel", "MAC" => "70:3e:ac:07:c1:34", "PresentVarID" => 15995),
            array("Name" => "iPhone Lilly", "MAC" => "88:1f:a1:c0:a3:14", "PresentVarID" => 28131),
            );

// Eine weitere Lockup Tabelle für die Accesspoints und deren Alias.
$apList = array(
            array("Name" => "Buero", "MAC" => "04:18:d6:10:1f:29"),
            array("Name" => "Balkon", "MAC" => "04:18:d6:9a:62:5a"),
                        );


// ----------------------------------------------------------------------------------
// Ab hier dann bitte nichts mehr ändern
// ----------------------------------------------------------------------------------
include "unifi.php";

$clientList = Unifi_GetClients();

$scriptResult = "";

foreach($clientList->data as $client)
{

    $scriptResult .= "<tr style='height:20px;font-size:12px;'>";

    // Name über MACNummer rausfinden.
    // Nicht alle Geräte senden anständig ihren Namen mit. Deswegen über Liste arbeiten
    $clientName = "";
    foreach($macList as $key => $entry)
       if ($entry["MAC"] == $client->mac)
        {
            $clientName = $entry["Name"];
            break;
        }

    // War nicht in Liste!
    if ($clientName == "")
            $clientName = $client->hostname;

    $scriptResult .= "<td>".$clientName."</td>";

    $scriptResult .= "<td style='text-align:center'>".$client->mac."</td>";
    $scriptResult .= "<td style='text-align:center'>".$client->ip."</td>";

    // Accesspoints übersetzen
    $apName = "";

    foreach($apList as $ap)
       if ($ap["MAC"] == $client->ap_mac)
       {
            $apName = $ap["Name"];
            break;
        }

    // War nicht in Liste!
    if ($apName == "")
        $apName = $client->ap_mac;

    $scriptResult .= "<td style='text-align:center'>$apName</td>";
    $scriptResult .= "<td style='text-align:center'>".$client->essid."</td>";
    $scriptResult .= "<td style='text-align:center'><div style='width:100%;height:20px;overflow:hidden;'>";

    // Pegelumwandlung - Entspricht leider nicht dem Wert in der Webconsole. Kein Plan wie die das berechnen
    /* 100% -35 / 50% -65 / 1% -95 */
    if ($client->signal <= -95)
        $percent = 1;
    else if ($client->signal >= -35)
       $percent = 100;
    else
        $percent = round(($client->signal + 95) / 0.6);

    if ($percent < 10)
        $levelImg = "0";
    else if ($percent <= 20)
        $levelImg = "1";
    else if ($percent <= 40)
        $levelImg = "2";
    else if ($percent <= 60)
        $levelImg = "3";
    else if ($percent <= 80)
        $levelImg = "4";
    else
        $levelImg = "5";

    $scriptResult .= "<img src='user/level/level$levelImg.png'> $percent% (Ch.".$client->channel.") ";

    if ($client->radio_proto == "a")
        $scriptResult .= "a";
    else if ($client->radio_proto == "ac")
        $scriptResult .= "ac";
    else if ($client->radio_proto == "b")
        $scriptResult .= "b";
    else if ($client->radio_proto == "ng")
        $scriptResult .= "n";
    else if ($client->radio_proto == "g")
        $scriptResult .= "g";

    $scriptResult .= "</div></tr>";

}

// ------------------------------------------------
// Anwesenheitserkennung (Testinstallation)
// ------------------------------------------------
foreach($macList as $key => $entry)
{
      $macList[$key]["Present"] = false;
}

foreach($clientList->data as $client)
{

    // Name über MACNummer rausfinden.
    // Nicht alle Geräte senden anständig ihren Namen mit. Deswegen über Liste arbeiten
    $found = false;
    foreach($macList as $key => $entry)
    {
       if ($entry["MAC"] == $client->mac)
          $macList[$key]["Present"] = true;
    }
}

foreach($macList as $key => $entry)
{
    // Nur einen Wert setzen, wenn auch ein Target vorhanden ist
    if (isset($entry["PresentVarID"]))
        SetValue($entry["PresentVarID"],$entry["Present"]);
}

// ------------------------------------------------
// ------------------------------------------------

$htmlBox = "";
$htmlBox .= "<table style='width:100%;font-size:14px;'>";
$htmlBox .= "<tr><td style='text-align:left;font-size:12px;' colspan='10'>Letzte Aktualisierung: ".date("H:i:s d.m.Y")."</td></tr>";
$htmlBox .= "<tr style='height:1px;'><td style='background-color:#aaaaaa;' colspan='10'></td></tr>";

if ($scriptResult == "")
    $htmlBox .= "<tr><td style=''>Keine Clients im WLAN</td></tr>";
else
{
   $htmlBox .= "<tr><th>Name</th><th>MAC</th><th>IP</th><th>AP</th><th>WLAN</th><th>Pegel</th></tr>";
    $htmlBox .= $scriptResult;
}

SetValue($htmlBoxID,$htmlBox);

?>

läuft bei Version 4.6.3 .

Völlig genial, das klappt jetzt!

:slight_smile:

Danke,
Loerdy