Ubiquiti - Unifi Video

Hallo zusammen,

ich habe versprochen noch eben die Skripte für die Ubiquiti WebCams hier rein zu stellen. Na dann wollen wir doch mal. Obwohl es mit ein paar Stolpersteinen versehen ist.

Also es geht los mit einem Skript, welches die aktuell vorhandenen Kameras aus der Unifi Video API zieht, und dafür entsprechende Informationen zur Verfügung stellt.

Bilder sagen mehr als Worte…

Jede Kamera erhält einen Ordner (ausgehend vom Skript) mit seinem Namen und den Infos, wie im Bild oben zu sehen.
Im Objektbaum sieht es dann wie folgt aus…

IPS-PC - VNC Viewer 2015-03-12 22-23-35.jpg

Am besten einen Ordner erstellen, und das folgende Skript anpassen, und in den Ordner schieben. Dazu einen Timer, der die Daten aus der API zieht.

HINWEIS: Mir ist aufgefallen, dass schnelle Anfragen den Zugang schnell dicht machen. Also am besten dafür Sorgen, die Schnittstelle nicht zu oft zu beaufschlagen. Vor allem im Zusammenhang mit den nachher noch erwähnten ImageGrabber sorgt das für Stress.

Skript GetCamInfo in IPS erzeugen…


<?php
// IP+Port von Unifi Video Webfront
$webfrontIP = "127.0.0.1:7443";
// API Key - Zu bekommen direkt aus dem Webfront "Settings -> My Account Settings -> API Access" ggf. einen Key anfordern!
$apiKey = "MEIN_API_KEY";

// ---------------------------------------
// Ab hier nix mehr ändern
// ---------------------------------------

include "orga.php";

$camDataJSON = getSslPage("https://".$webfrontIP."/api/2.0/camera/?force=true&apiKey=".$apiKey);

$camData = json_decode($camDataJSON);


$parentID = IPS_GetParent ($_IPS["SELF"]);

foreach($camData->data as $cam)
{
		$catID = CreateCategory($cam->name,$cam->mac, $parentID);

		CreateVariable("LastRecording",3,date("H:i:s d.m.Y",$cam->lastRecordingStartTime/1000),  $cam->mac."lastRecording",$catID);
		CreateVariable("CPULoad",1, $cam->systemInfo->cpuLoad, $cam->mac."CPULoad",$catID);
		CreateVariable("Firmware",3, $cam->firmwareVersion, $cam->mac."FirmwareVersion",$catID);
		CreateVariable("IP",3, $cam->host, $cam->mac."Host",$catID);

	// State muss wegen des VarProfils umgewandelt werden
	   if ($cam->state == "CONNECTED")
			CreateVariable("State",1, 0, $cam->mac."State",$catID);
		else if ($cam->state == "REBOOTING")
			CreateVariable("State",1, 1, $cam->mac."State",$catID);
		else if ($cam->state == "DISCONNECTED")
			CreateVariable("State",1, 2, $cam->mac."State",$catID);
		else if ($cam->state == "UPGRADING")
			CreateVariable("State",1, 3, $cam->mac."State",$catID);
		else if ($cam->state == "UNAUTHENTICATED")
			CreateVariable("State",1, 4, $cam->mac."State",$catID);

			
		else
		{
			CreateVariable("State",1, 5, $cam->mac."State",$catID);
			CreateVariable("StateUnknown",3, $cam->state, $cam->mac."StateUnknown",$catID);
		}
}

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // This is the key here, telling curl to ignore the self-signed certificate.
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}
?>

Dazu gehört das File im Include… bitte in den Ordner IP-Symcon\scripts\orga.php kopieren.

orga.php.zip (739 Bytes)

Sobald das GetCamInfo Skript gestartet wird, sollte es selbstständig die entsprechenden Infos anlegen.
Eine Variable brauch ein spezielles Profil. Siehe Bild:

CPULoad (Intensity100%) die anderen nach deinen Wünschen. :slight_smile:

Sooo… nun fehlen noch die entsprechenden Standbilder. Früher war es noch möglich bei den Aircams und Unifi Video Cams über einen Link ala http://ip/snapshot.cgi das aktuelle Bild abzurufen. Dies ist mit den aktuellen Firmware Versionen so nicht mehr ohne weiteres möglich. Es kann sein, dass Ubiquiti dies wieder einführt, da sich zml. viele User beschwert haben. Aber solang es so nicht geht, habe ich eine andere Lösung gefunden, die das Bild aus dem Fundus zieht.
Bzw. das Bild kommt gar nicht von der Kamera direkt, sondern von der gleichen Software, wo ich auch die Kamerainfos her ziehe.

Da ich gerne den ImageGrabber weiterhin benutzen wollte, habe ich folgendes gemacht.

grabber.jpg

Und zwar habe ich eine weitere PHP Datei, die mir (auf einen anderen Apache gelegt) das Bild zur Verfügung stellt. So kann ich ohne weitere Authentifizierungsprobleme die Datei ran holen. Sicher könnte man auch die Daten in eine Datei speichern, und die dann auch anzeigen. Aber es ist nun mal so, wie es ist. :wink:

In dem Screenshot sieht man… url/getCam.php?c=1 wobei c für die CamID steht… es geht los mit 0,1,2 usw… je nachdem wieviele Cams eingetragen sind.

Das getCam Skript sieht dann folgendermaßen aus. Innerhalb des oberen Arrays befinden sich Links mit denen die Kamerabilder direkt abgerufen werden.


<?php
header('Content-Type: image/jpeg');

$apiKey = 'MEIN_API_KEY'
$unifiVideoIP = '192.168.0.11:7443';

// Im folgenden Array bitte je nach Anzahl der Kameras entsprechend viele Elemente eintragen. Wichtig ist hierbei, die UUID der Kamera zu ergänzen. Ich habe eine als Beispiel drinnen gelassen, damit man den Aufbau erkennt.

$cams = array(	
// 0 Garage (alt)
  'https://'.$unifiVideoIP.'/api/2.0/snapshot/camera/86a65eea-312b-380d-b399-d940b2c02a82?force=true&apiKey='.$apiKey,
// 1 Baustelle
  'https://'.$unifiVideoIP.'/api/2.0/snapshot/camera/CAMUUID?force=true&apiKey='.$apiKey,
// 2 Seite links
  'https://'.$unifiVideoIP.'/api/2.0/snapshot/camera/CAMUUID?force=true&apiKey='.$apiKey
// usw...

			);


echo getSslPage($cams[$_GET["c"]]);

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}
?>

Die UUID kann man über mehrere Wege abfragen. Am einfachsten ist - in der Config muss die Motion Detection aktiviert sein, und dann guckt man im folgenden Ordner nach der gewünschten ID.
Der Basisordner von liegt bei mir c:\ProgramData\unifi-video\data\videos\ und dort befinden sich auch schon die UUIDs. Vorraussetzung ist mindestens 1 Aufnahme per Moition Detection.

Ich hoffe ich habe nix vergessen. Ansonsten nachfragen und nerven.

Beste Grüße
Kevin

Besten Dank, klappt einwandfrei…

Bis auf das vergessene Semikolon, hat alles auf anhieb gepasst :slight_smile:

Gruss aus der Schweiz

$apiKey = 'MEIN_API_KEY' ;

Hallo Spoosie,

ist die API irgendwo dokumentiert? Ich habe bei UBNT nichts gefunden.

Ich würde gerne per API eine Videoaufzeichnung starten. Also quasi eine Motion simulieren.
Hast du da evtl. etwas gesehen?

Danke & Gruß

Philipp

Hi… die Api ist so gut wie undokumentiert. Man muss sich da was aus Codeschnipseln und selber raten zusammenfummeln. Nicht sehr komfortabel. Wenn die neuen UVC’s auch mit der Synology laufen würden, hätt ich wohl schon längst umgestellt. :frowning:

Hallo!

Danke erstmal, für die Lösung, warte schon lange auf eine Möglichkeit, die Unifi Cams einzubinden.
leider bekomme ich beim Ausführen des getCam Script eine Fehlermeldung:
Notice: Undefined index: c in C:\IP-Symcon\scripts\52320.ips.php on line 19

line 19: echo getSslPage($cams[$_GET[„c“]]);

Irgendeine Idee dazu?

Besten Dank!

Das läuft ein bischen anders. Du musst das Skript nicht in IPS aufrufen, sondern aus dem Browser, mit dem Parameter c=0…1…2 usw. Und diese URL trägt man dann in eine ImageGrabber Instanz ein. Das Skript muss dann verschoben werden, damit es vom Webserver erreichbar ist. Z.B. /webfront/user/…

Sorry, war ein Denkfehler, hab hab getCam.php nun auf einen Webserver gelegt und den Image Grabber angepasst.
Jetzt läufts! Danke nochmal!!

Jetzt bin ich nochmal lästig.
Die Bilder werden zwar vom Image Grabber geholt und als jpg im Ordner cams gespeichert, allerdings sind die jpg Files scheinbar nicht in Ordnung. Man kann sie weder über das Webfront noch direkt öffnen. „Das Bild kann in der Windows Fotoanzeige nicht geöffnet werden, da die Datei möglicherweise beschädigt oder zu groß iost“ :confused:

Wenn ich die Url im Browser eintrage, bekomme ich ganz normal das Bild.
Hab es über einen externen IIS und über den Internen Webserver versucht, beides das selbe Ergebnis!?

Abweichend zu deinem Screenshot muss ich auch den Typ beim Grabber auf jpg stellen, da bei „automatisch“ die Meldung: „Kann Bildtyp für Inhaltstyp text/html nicht erkennen“ kommt.

Danke im Voraus!

lg

So, nach langem suchen hab ich den Fehler gefunden, es war ein böses Leerzeichen in der getCam.php…

Danke nochmal für die Hilfe!!:slight_smile:

An dieser Stelle ein großes Dankeschön an Spoosie. Habe nun auch meine erste Unifi in IPS integriert.
Leider habe ich es nicht geschafft das Standbild nach der Anleitung in IPS zu integrieren.

Mit der aktuellen Firmware ist es aber möglich das Standbild über den NVR zu beziehen.
Der Link dafür sieht wie folgt aus:

http://„NVR-IP-Adresse“:7080/api/2.0/snapshot/camera/„CAMID“?force=true&apiKey=„APIKey“

die CAMID lässt sich aus der „RTSP URL“ ermitteln. Wichtig ist es die letzten zwei Zeichen nicht mit zu kopieren also nur bis zum Unterstrich kopieren.

Das reine Bild kann man mittlerweile jecht einfach abgreifen. Leider aber auf Grund von fehlendem mjpeg Stream kein Video :frowning:

Bild abgreifen per ImageGrabber: http://192.168.2.200/snap.jpeg

Hallo!

Das Skript funktionier super …… nur eine Frage was sagt der Status aus? …. für die Motion Funktion ist er nicht … gibt’s eine Abfrage wo auch die Motion als Satus dargestellt wird das man z.b. eine Klingel damit ansteuern kann ?

Danke!

LG
Christian

Hallo Leute,

ich habe mir einen WHS angeschafft und jetzt das IPS und den NVR von Unifi auf einem System laufen, nun habe ich das Problem das das System weder mit der geräteIP noch mit der $webfrontIP = „127.0.0.1:7443“; erreicht werden kann.

Hab die Firewall ausgeschaltet weil ich dachte das sei der grund, leider funktioniert es noch immer nicht
Hat jemand eine Idee?

LG
Christian

Welches System meinst du mit nicht erreichbar ? IPSymcon oder Unifi ?
Unifi ist bei mir Port 8443.

Hallo!

Danke für deinen Input, hab jetzt das Skript so verändert das es über die HTTP Schnittstelle zugreifen kann

<?php 
// IP+Port von Unifi Video Webfront 
$webfrontIP = "127.0.0.1:7080"; 
// API Key - Zu bekommen direkt aus dem Webfront "Settings -> My Account Settings -> API Access" ggf. einen Key anfordern! 
$apiKey = "********************"; 

// --------------------------------------- 
// Ab hier nix mehr ändern 
// --------------------------------------- 

include "orga.php"; 

$camDataJSON = getSslPage("http://".$webfrontIP."/api/2.0/camera/?force=true&apiKey=".$apiKey); 

Hallo zusammen

In Unifi Protect kann man ja RTSP Streams aktivieren unter Manage.

In der 5.1 wird RTSP soweit unterstützt (so wie ich das verstanden habe), ich habe jetzt einmal versucht den Stream einzubinden. Es kommt allerdings immer Verbindungsfehler.

Hat das schon jemand zum laufen gebracht?

Gruss
ChacalCH

Hallo miteinander,

ich habe das Skript eingefügt wie im #1 beschrieben aber leider passiert da nix.

  • die GetCamInfo in einem Ordner erstellt und angepassst.
  • orga.php in den script ordner kopiert.
  • dann die GetCamInfo ausgeführt.

Sobald das GetCamInfo Skript gestartet wird, sollte es selbstständig die entsprechenden Infos anlegen.

Es wird diese Fehlermeldung ausgegeben:

Notice: Trying to get property ‚data‘ of non-object in /var/lib/symcon/scripts/47023.ips.php on line 20

Warning: Invalid argument supplied for foreach() in /var/lib/symcon/scripts/47023.ips.php on line 20

Was mach ich denn falsch?
Vielen Dank fürs unterstützen.

In der GetCamInfo steht in der Zeile 20 folgender Code:

foreach($camData->data as $cam)

das noch vollständigkeithalber

Hat keiner eine Idee?

kann mir keiner helfen?
Ich habe auch schon versucht den stream per RTSP direkt in IPS einzubinden. Klappt aber auch nicht! Es wird immer das untere drittel vom Bild vermurkst…
Vielen Dank schon mal an jeden der mir hierbei etwas weiterhelfen kann.

Ich vermute, Du hast Unifi Protect am laufen und das Script ist nicht kompatibel.
Das ist nämlich ursprünglich für das Vorgänger Product (unifi NVR) gedacht.
Das gibt es auch noch und hat auch den Cloudzwang nicht. Vielleicht kannst Du es damit probieren?

Ich habe den Cloudkey am Laufen und daher eine Art „Protect Zwang“. Zufrieden bin ich damit nicht, möchte aber auch kein
zweites System laufen haben. Da bei den RTSP Streams immer ein Versatz von mehreren Secunden ist hole ich bei meinen
Kamears alle 3 Secunden ein Standbild über den Image Grabber. Der Aufruf lautet dann http://xxx.xxx.xxx.xxx/snap.jpeg, wobei die
xxx mit Deiner IP-Adresse ersetzt werden müssen.

loerdy