[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“