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…
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.
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.
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.
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