[Modul] UniFi Toolbox (Anwesenheit, Blocken, Internet, Geräte und Endpointüberwachung)

Wir haben bei @tharit schon angefragt.
Leider bisher keine Rückmeldung.

siehe zweiten Teil dieser Antwort:

Danke dir @Brovning - habe ich mittlerweile auch schon gesehen und umgesetzt. Siehe meinen letzten Post ;).

Danke trotzdem für die Hilfe.

Schade - drücke die Daumen, das @tharit sich noch meldet.

Wäre Klasse, die Motiondetection von den Kameras zu nutzen würde noch mal einen Mega Benefit bedeuten mit dem Modul :slight_smile: .

Hab selber mal etwas getestet mit Protect…

Hier les ich die Kamera aus:

<?php

//Start writing your code here
$ServerAdress="192.168.178.3";
$ServerPort=443;
$SuffixURL = "/api/auth/login";
$Cookie=GetValueString(56334);

$ch = curl_init();
$MiddlePartURL = "/proxy/protect/api/bootstrap";
//$MiddlePartURL = "/proxy/protect/api/cameras/60fd77cf001fae03870003f0";
curl_setopt($ch, CURLOPT_URL, "https://".$ServerAdress.":".$ServerPort.$MiddlePartURL);
curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("cookie: ".$Cookie));
curl_setopt($ch, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1'); 	    

$RawData = curl_exec($ch);
curl_close($ch);
$JSON = json_decode($RawData,true);
//$this->SetBuffer("$RawData",$RawData);
//print_r($RawData);
if ($RawData != "Unauthorized") {
    if (isset($RawData)) {
        $JSON = json_decode($RawData,true);    
        foreach ($JSON['cameras'] as $cam) {
            if ($cam['name']=='Einfahrt') {
                $date = new DateTime();
                $date->setTimestamp(intval($cam['lastMotion']/1000));
                SetValueString(30048,$cam['firmwareVersion']);
                SetValueString(19671,$cam['host']);
                SetValueString(20214,$cam['id']);
                SetValueString(29423,$date->format('d.m.Y H:i:s'));
                SetValueString(22990,$cam['name']);
                SetValueString(42756,$cam['type']);
                $infoString="Uptime: ".round($cam['uptime']/3600,0)."h".chr(10);
                $infoString=$infoString."Mikrofon Volume: ".$cam['micVolume']."%".chr(10);
                $infoString=$infoString."Events Today: ".$cam['eventStats']['motion']['today']."".chr(10);
                $infoString=$infoString."Events Durchschnitt: ".$cam['eventStats']['motion']['average']."".chr(10);
                $infoString=$infoString."NVR: ".$JSON['nvr']['name']."".chr(10);
                $infoString=$infoString."NVR IP: ".$JSON['nvr']['host']."".chr(10);
                $infoString=$infoString."NVR Firmware: ".$JSON['nvr']['version']."".chr(10);
                SetValueString(32360,$infoString);
                
            }
        }            
    }
} else {
    IPS_RunScript(54177);
}

Und die Events einfach im Sekundentakt, Motion/Access getrennt, + Thumbnail Download.

Login hab ich mit aus der Unifi Toolbox geklaut und schreib den Cookie in eine String Variable…

<?php

//Start writing your code here
$ServerAdress="192.168.178.3";
$ServerPort=443;
$SuffixURL = "/api/auth/login";
$Cookie=GetValueString(56334);

$ch = curl_init();
$time=round(microtime(true) * 1000)-(120*60*1000);
//$time=microtime(true)-(5*60*1000);
//print_r($time.chr(10));
$MiddlePartURL = "/proxy/protect/api/events?start=".$time."&limit=100&type=motion";
curl_setopt($ch, CURLOPT_URL, "https://".$ServerAdress.":".$ServerPort.$MiddlePartURL);
curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("cookie: ".$Cookie));
curl_setopt($ch, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1'); 	    

$RawData = curl_exec($ch);
curl_close($ch);
$JSON = json_decode($RawData,true);
//$this->SetBuffer("$RawData",$RawData);
//print_r($RawData);
if ($RawData != "Unauthorized") {
     if (isset($RawData)) {
        $JSON = json_decode($RawData,true);
        //print_r($JSON);
        if (count($JSON)>0) {
            $date = new DateTime();
            if ($JSON[count($JSON)-1]['type']=="motion") {
                $Alt=GetValueString(11471);
                $AltEnd=GetValueString(51875);
                if ($Alt!=$JSON[count($JSON)-1]['id'] or $AltEnd=="" ){
                    $thumbnail=$JSON[count($JSON)-1]['thumbnail'];
                    SetValueString(11471,$JSON[count($JSON)-1]['id']);  
                    $date->setTimestamp(intval($JSON[count($JSON)-1]['start']/1000));          
                    SetValueString(11399,$date->format('d.m.Y H:i:s'));
                    $date->setTimestamp(intval($JSON[count($JSON)-1]['end']/1000));
                     if (!isset($JSON[count($JSON)-1]['end'])) {
                        SetValueBoolean(10080,true);
                        SetValueString(51875,"");
                    } else {
                        SetValueBoolean(10080,false);
                        SetValueString(51875,$date->format('d.m.Y H:i:s'));
                        $date->setTimestamp(intval($JSON[count($JSON)-1]['start']/1000));      
                        $EventString="Kamera: ".$JSON[count($JSON)-1]['camera'].chr(10);    
                        $EventString=$EventString."Start: ".$date->format('d.m.Y H:i:s').chr(10);
                        $date->setTimestamp(intval($JSON[count($JSON)-1]['end']/1000));
                        $EventString=$EventString."End: ".$date->format('d.m.Y H:i:s').chr(10);
                        $EventString=$EventString."Thumbnail: ".$thumbnail.chr(10);
                        SetValueString(12718,$EventString);
                    }                    
                    SetValueString(58341,$JSON[count($JSON)-1]['type']);
                    SetValueString(38571,$JSON[count($JSON)-1]['camera']);
                }
            } 
        }
     }
} else {    
    IPS_RunScript(54177);
}

if (isset($thumbnail)) {
    $saveto= IPS_GetKernelDir()."media/g3motion.jpg";
    //print_r($saveto);
    $MiddlePartURL = "/proxy/protect/api/thumbnails/".$thumbnail."?h=1080&w=1920";
    //print_r($MiddlePartURL);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://".$ServerAdress.":".$ServerPort.$MiddlePartURL);
    //$ch = curl_init ("https://192.168.178.3/proxy/protect/api/thumbnails/".$thumbnail."?h=1080&w=1920");
    curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("cookie: ".$Cookie));
    curl_setopt($ch, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1'); 	
    $raw=curl_exec($ch);
    curl_close ($ch);
    if (isset($raw)) {
        $ImageFile = IPS_GetKernelDir()."media/".$thumbnail.".jpg";     // Image-Datei
        $schonDa=false;
        if(file_exists($ImageFile)){
            unlink($ImageFile);
            $schonDa=true;
        }
        $fp = fopen($ImageFile,'x');
        fwrite($fp, $raw);
        fclose($fp);
        IPS_SetMediaFile(27533,$ImageFile,false);
        SetValueString(55561,date('d.m.Y H:i:s'));
        if ($schonDa==false) {        
            $MediaID = IPS_CreateMedia(1);                  // Image im MedienPool anlegen
            IPS_SetMediaFile($MediaID, $ImageFile, true);   // Image im MedienPool mit Image-Datei verbinden
            IPS_SetName($MediaID, "Thumbnail - ".date('d.m.Y H:i:s'));                 // Medienobjekt benennen
            IPS_SetParent($MediaID, 59221);  
        }
    }    
}
$ch = curl_init();
$time=round(microtime(true) * 1000)-(120*60*1000);
//$time=microtime(true)-(5*60*1000);
//print_r($time.chr(10));
$MiddlePartURL = "/proxy/protect/api/events?start=".$time."&limit=100&type=access";
curl_setopt($ch, CURLOPT_URL, "https://".$ServerAdress.":".$ServerPort.$MiddlePartURL);
curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("cookie: ".$Cookie));
curl_setopt($ch, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1'); 	    

$RawData = curl_exec($ch);
curl_close($ch);
$JSON = json_decode($RawData,true);
//$this->SetBuffer("$RawData",$RawData);
//print_r($RawData);
if ($RawData != "Unauthorized") {
     if (isset($RawData)) {
        $JSON = json_decode($RawData,true);
        //print_r($JSON);
        $date = new DateTime();
        if (count($JSON)>0) {
            if ($JSON[count($JSON)-1]['type']=="access") {
                $Alt=GetValueString(55852);
                $AltEnd=GetValueString(40690);
                if ($Alt!=$JSON[count($JSON)-1]['id'] or $AltEnd=="" ){
                    SetValueString(55852,$JSON[count($JSON)-1]['id']);  
                    $date->setTimestamp(intval($JSON[count($JSON)-1]['start']/1000));            
                    SetValueString(28618,$date->format('d.m.Y H:i:s'));
                    if (!isset($JSON[count($JSON)-1]['end'])) {
                        SetValueBoolean(26847,true);
                        SetValueString(40690,"");
                    } else {
                        SetValueBoolean(26847,false);
                        $date->setTimestamp(intval($JSON[count($JSON)-1]['end']/1000));
                        SetValueString(40690,$date->format('d.m.Y H:i:s'));
                        $date->setTimestamp(intval($JSON[count($JSON)-1]['start']/1000));
                        $EventString="Start: ".$date->format('d.m.Y H:i:s').chr(10);
                        $date->setTimestamp(intval($JSON[count($JSON)-1]['end']/1000));
                        $EventString=$EventString."End: ".$date->format('d.m.Y H:i:s').chr(10);
                        $EventString=$EventString."User ID: ".$JSON[count($JSON)-1]['user'];
                        SetValueString(51618,$EventString);                    
                    }                    
                    SetValueString(23880,$JSON[count($JSON)-1]['type']);
                    SetValueString(41284,$JSON[count($JSON)-1]['user']);     
                }
                //print_r($JSON);
            }
        }
        
     }
} else {    
    IPS_RunScript(54177);
}

Läuft nun seit 3-4Tagen, bisher recht zuverlässig, ein Thumbnail hab ich was nicht ordentlich runtergeladen wurde…

1 „Gefällt mir“

das schaut ja recht einfach aus … mal gucken wie wir weiter machen. Nächste Woche geht die Arbeit wieder los, aber es wird auf jeden Fall updates gehen. Aktuell warte ich erstmal auf die Freigabe der 1.3 seitens Symcon.

Neue Beta ist online (wie immer sofort erhältlich per Modulverwaltung. Anleitung)!

Es gibt Erweiterungen beim Fehlerhandling und Fehlerausgaben in der GUI:

Falls es noch jemand nicht im Modulestore gesehen hat … die Version 1.3 ist final.

2 „Gefällt mir“

Hallo Zusammen,
hat sich in Bezug auf das Thema Upload / Download Speed nochwas getan?

Gruß

Was meinst Du genau … aktuell, gemessen, …?

Hi,
tatsächlich wäre - je nachdem wie leicht das umsetzbar ist - beides interessant für mich, also die aktuelle Auslastung sowie der max. Speed („Speedtest“). Ich nutze bei mir die UDM Pro.

Gruß

siehe Beta:

Theoretisch könnte man sogar den Speedtest per Modul triggern:

Callable commands

Manager Call Notes
evtmgt archive-all-alarms
sitemgr add-site desc = Descriptive name ( required ), name = shortname ( in the URL )
sitemgr delete-site name = short name ( required )
sitemgr update-site desc = Descriptive name ( required )
sitemgr get-admins List all administrators and permission for this site
sitemgr move-device mac = device mac ( required ), site_id = 24 digit id ( required )
sitemgr delete-device mac = device mac ( required )
stamgr block-sta mac = client mac ( required )
stamgr unblock-sta mac = client mac ( required )
stamgr kick-sta Disconnect: mac = client mac (required )
stamgr forget-sta Forget a client ( controller 5.9.x only )
stamgr unauthorize-guest Unauthorize a client device, mac = client mac (required)
devmgr adopt mac = device mac ( required )
devmgr restart mac = device mac ( required )
devmgr force-provision mac = device mac ( required )
devmgr power-cycle mac = switch mac ( required ), port_idx = PoE port to cycle ( required )
devmgr speedtest Start a speed test
devmgr speedtest-status get the current state of the speed test
devmgr set-locate mac = device mac ( required ) blink unit to locate
devmgr unset-locate mac = device mac ( required ) led to normal state
devmgr upgrade mac = device mac ( required ) upgrade firmware
devmgr upgrade-external mac = device mac ( required ), url = firmware URL ( required )
devmgr migrate mac = device mac ( required ), inform_url = New Inform URL to push to device (required)
devmgr cancel-migrate mac = device mac ( required )
devmgr spectrum-scan mac = device mac ( ap only, required ) trigger RF scan
backup list-backups list of autobackup files
backup delete-backup filename ( required )
system backup create a backup. This appears to backup to a fixed location in the filesystem
stat clear-dpi resets the site wide DPI counters

source: products:software:unifi-controller:api [Ubiquiti Community Wiki]

Die Frage ist halt generell wo Symcon einen Mehrwert liefert. Die Speedtests laufen bei mir eh einmal am Tag oder so - das kann man einstellen. Aber schon mal super das die Anzeige so schnell kam.

Ich nehme es mal in Beta, dann kann man einfach via Module Store Updaten.

Exakt, geht mir genauso.

Was gibt es in der Liste ansonsten für Befehle, die uns vielleicht etwas nutzen würden?
Automatischer Backup-Download und speichern auf dem Netzlaufwerk? :slight_smile:

Hallo,
habe mich heute wieder mit dem Modul beschäftigt, da ich gerade dran bin mir eine neue saubere Symcon Installation anzulegen und muss sagen läuft alles wunderbar, Danke dafür.

Wenn ich jetzt einen Switch mit Device Monitor anlege der mit der UDM Pro verbunden ist, wähle ich dann Genric Device aus? Ist es dort möglich noch in das Modul mit aufzunehmen das man den Switch manuell neu starten könnte und Verbindungsdaten z.B. über welchen Modus der Switch angebunden ist, Geschwindigkeit, Pakete oder wieviel GB gesendet und empfangen wurden, IP Adresse, Uplink etc.

Könnte man beim Endpoint Monitor bei WLAN noch ergänzen mit welchem Access Point das Gerät sich verbunden hat?

Beim einbinden (Endpoint Monitor) eines Endgerätes (Homematic LAN GW) bekomme ich folgende Meldung wenn ich die Gerätedaten abrufe:

image

Es hat was mit den Verbindungsdaten zu tun. Wenn ich die deaktiviere geht es. Aber scheint wohl am Gerät zu liegen. Es ist eine alte CCU2 die umfunktioniert wurde zum LAN GW. Ein „Original HM LAN GW“ funktioniert.
Das gleiche ist auch bei meinem Wechselrichter der Fall.

Edit: Habe nun ein zweites Homematic LAN Gateway eingepflegt und habe die gleiche Fehlermeldung mit Satisfaction.

Bevor ich das Modul installiere möchte ich wissen, ob ich damit auch Gastnetzwerk ein/auschalten kann, einzelne Geräte reconnecten kann
ggf. auch einen AP neu booten kann?

Weiß das jemand?

Aktuell kann man noch keine WLAN ein/aus schalten. Steht auf der Roadmap. Mal gucken wann Zeit ist.
Einzele Geräte sperren/entsperren geht mit dem Device Blocker Modul.

AP Reboot steht nicht auf der Roadmap. Was wäre hier der Usecase das über Symcon zu automatisieren?

Hi,
ich habe Shellys im Einsatz, leider sind diese manchmal nicht erreichbar aber über einen Reconnect bekomme ich sie wieder zum Leben… Ein Unifi AP macht ab und an Probleme, ein Reboot behebt dann das Problem.
War nur eine Frage ob Dein Modul das unterstützt. In der API habe ich gesehen, dass es ein reconnect eines Devices wohl gibt.

Hab wieder ab und an viele Fehlermeldungen:

08.04.2022, 22:14:24 | PHP                  | Error: Notice: Undefined index: ip
   Error in Script /var/lib/symcon/modules/.store/unifi/UniFi Endpoint Monitor/module.php on Line 195
  137 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
   44 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
  195 in modules/.store/unifi/UniFi Endpoint Monitor/module.php (call IPSLogger_PhpErrorHandler)
  8795 in __generated.inc.php (call EndpointMonitor)
    1 in /- (call UEM_EndpointMonitor)