Moin,
ich habe mir für meine Unifi Accesspoints von Ubiquiti ein Skript gemacht, womit man sich ein paar Informationen über die angemeldeten Clients auslesen kann.
Vielleicht hat ja der ein oder andere von euch auch diese Geräte und kann mit diesem Skript etwas anfangen.
Anleitung im Skript
<?
// 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 = 12345 /*[Network\Ubiquiti\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" => "Belkin HomeServer", "MAC" => "de:ad:be:ef:fe:ed"),
array("Name" => "iMac", "MAC" => "de:ad:be:ef:fe:ed"),
array("Name" => "Handy Kevin", "MAC" => "de:ad:be:ef:fe:ed", "PresentVarID" => 20082)
);
// Eine weitere Lockup Tabelle für die Accesspoints und deren Alias.
$apList = array(
array("Name" => "Dachboden", "MAC" => "de:ad:be:ef:fe:ed"),
array("Name" => "Flur unten", "MAC" => "de:ad:be:ef:fe:ed"),
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)
$scriptResult .= "a";
else if ($client->is_11ac)
$scriptResult .= "ac";
else if ($client->is_11b)
$scriptResult .= "b";
else if ($client->is_11n)
$scriptResult .= "n";
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);
?>
Dann gibt es noch eine Funktionslib, die ich angefangen habe. (Siehe Anhang) Da könnte ich demnächst noch ein paar andere nette Features wie „AuthorizeDevice“ über Mac Adresse, Blockieren von Devices, Abfrage und erstellen von Vouchers.
In der Lib musst Du dann noch Login+Pass+IP der Unifi Software eintragen. Das ganze dann entsprechend in …/IP-Symcon/scripts/unifi.php kopieren.
Dazu gibt es dann noch ein paar Grafiken für die Signalstärke. (Selbstgemacht - Also gerne benutzen)
Diese bitte in …/IP-Symcon/webfront/user/img/verkehr/… kopieren.
Wenn Interesse besteht, mach ich da mal weiter. Derzeit habe ich nur das eingebaut, was ich derzeit dringend brauche.
Freu mich über Kommentare
Gruß
Kevin
unifi.php.zip (1.26 KB)
level.zip (15.5 KB)