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

Checkin wurde reverted!

...
"name":"default",
"desc":"Default",
"attr_hidden_id":"default",
...

(siehe: https://<< IP >>:<< PORT >>/proxy/network/api/self/sites bzw. https://<< IP >>:<< PORT >>/api/self/sites)

→ „name“ und nicht „description“ ist wichtig!

@mahaf
@loerdy
@timloe
Ich vermute mal dass ihr bisher nur die Description der Site geändert hattet, daher muss weiterhin „default“ als Site verwendet werden!
Habe ich mal zum HowTo 401 hinzugefügt.

Ich bin im Hauptrelease und hab dort ein Update gemacht. Wenn ich auf Beta wechseln möchte oder eine Neuinstallation des Moduls bekomme ich:
image
Nur wie mache ich eine Deinstallation? Ich möchte meine Variablen nicht verlieren.

Unifi Presence Manager

Habe ich alles versucht. Auch alle Schreibweisen. Meine Seite ist umbenannt (ich habe mehrere). Bisher war bei mir immer Site auf „default“ und es hat funktioniert.

TXT: 05.01.2022, 09:06:58 |       Authentication | Return-Code Provided is: 401
HEX: 05.01.2022, 09:06:58 |       Authentication | 52 65 74 75 72 6E 2D 43 6F 64 65 20 50 72 6F 76 69 64 65 64 20 69 73 3A 20 34 30 31 
TXT: 05.01.2022, 09:06:58 |       Authentication | 401 Unauthorized / 403 Forbidden - Die Anfrage ging an den richtigen Server, allerdings konnte sich Symcon nicht anmelden. Bitte Login Daten prüfen.
HEX: 05.01.2022, 09:06:58 |       Authentication | 34 30 31 20 55 6E 61 75 74 68 6F 72 69 7A 65 64 20 2F 20 34 30 33 20 46 6F 72 62 69 64 64 65 6E 20 2D 20 44 69 65 20 41 6E 66 72 61 67 65 20 67 69 6E 67 20 61 6E 20 64 65 6E 20 72 69 63 68 74 69 67 65 6E 20 53 65 72 76 65 72 2C 20 61 6C 6C 65 72 64 69 6E 67 73 20 6B 6F 6E 6E 74 65 20 73 69 63 68 20 53 79 6D 63 6F 6E 20 6E 69 63 68 74 20 61 6E 6D 65 6C 64 65 6E 2E 20 42 69 74 74 65 20 4C 6F 67 69 6E 20 44 61 74 65 6E 20 70 72 C3 BC 66 65 6E 2E 

LG
Tom

Da uns das Thema site-name eine weile beschäftigt hatte, habe ich zur einfachen Überprüfung einen Knopf „check site name“ in jede Modul-Instanz hinzugefügt:

Zunächst prüfen, ob du die Unifi-Toolbox per Symcon-ModulStore installiert hast. Dort das Modul auswählen und auf „Delete“ klicken.
Danach zur „Modul Control“ unter „Core Instances“ wechseln und dort die Unifi-Toolbox mit der URL „https://github.com/elueckel/Unifi-Toolbox“ hinzufügen:


Sollte diese dort schon vorhanden sein, einmal löschen und nochmals hinzufügen.
Mit dem Zahnrad kannst du bequem zwischen Main und Beta hin- und herwechseln.

Nachdem du im ModulControl auf Beta gewechselt hast, führe mal in der Instanz von Presence Manager per Klick „check Site name“ aus.

Die Motion detection kann man über die Unifi Protect Realtime Websocket API ganz komfortabel bekommen. Momentan in Symcon etwas umständlich weil den WebSockets ein paar Features fehlen (Binary Messages), habe da aber schon mit paresy geredet, vllt kommt das in Zukunft.

Ich hab da aktuell ein Modul mit einer eigenen WebSocket Implementierung (basierend auf dem alten IPSNetwork Code) für gebaut, und nutze das auch schon zum schalten der Aussenbeleuchtung.

Habe momentan nicht soviel Zeit dafür, deswegen hat es zb keine Discovery Funktion, muss das bei Gelegenheit mal fertig machen und veröffentlichen.

Kann aber gern schon getestet werden, oder ggf als Inspiration dienen. Fragen gern per PM, hier gehts ja um ein anderes Modul.

Danke für die Info. Bin auf das Modul Control gewechselt.

Mit der aktuellen Beta geht bei mir die Anmeldung wieder. Vielen Dank! Site steht auf „default“. Check Site Name bringt:
image

LG
Tom

1 „Gefällt mir“

Meine klare Empfehlung an alle, die testwillig sind und häufig latest and greatest haben wollen:
Wechselt auf das ModulControl und geht weg vom Symcon-ModulStore, da ihr dort Änderungen viel zu spät bekommt…

siehe zweiten Teil dieser Antwort:

Der Device Blocker wurde in der aktuellen Beta umbenannt in Endpoint Blocker … damit ist es sauberer, dass ein Device etwas von Unifi ist und ein Endpoint ein Endgerät was an Unifi hängt.

In der Theorie sollte das im Hintergrund passieren, aber bitte mal melden ob es Probleme beim Update gibt (wäre dann was für die Doku :slight_smile: )

Das Update funktionierte bei mir ohne Fehler.
Lediglich die public function Aufrufe (sofern verwendet) müssen von UDB in UEB umbenannt werden.
Bspw.:
UDB_block($InstanzID, $device); → UEB_block($InstanzID, $device);

Danke für den Tipp, wie geht das genau?

@tharit : Das klingt interessant - @BommelPommel , wäre es nicht interessant das mit zu integrieren und mit dem Ansatz Motion detection zu integrieren? Dann brauchst du nicht das Rad neu zu erfinden.

Hallo, habe es hierüber auch versucht - bekomme aber die Fehlermeldung:

Fatal error: Uncaught Error: Call to undefined function UDB_AuthenticateAndProcessRequest() in C:\Windows\System32-:3
Stack trace:
#0 {main}
thrown in C:\Windows\System32- on line 3

Was kann das sein? Spiele jetzt erst mal ein Backup zurück.

Danke.

Fehler gefunden - war nur das Passwort nicht korrekt. Nun geht es mit der aktuellen Version. Musste leider nur wieder die Instanzen mit allen Kameras/MAC-Adressen anlegen, meine Scripte anpassen sowie die Alexa Geräte neu einrichten/suchen/Routinen anpassen.

Aber nun geht es.

Danke an @BommelPommel für das geniale Modul und alle die hier unterstützen :slight_smile: .

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: