da die DLINK DCS-933L andere URLs in Verwendung hat, als andere Dlink-Modelle, möchte ich euch mein modifiziertes IPSConponent Skript zur Verfügung stellen. Als Basis habe ich IPSComponentCam_DLink verwendet Vielleicht kann mans ja auch fix in die IPSLibrary übernehmen.
LG Stefan
<?
/*
* This file is part of the IPSLibrary.
*
* The IPSLibrary is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The IPSLibrary is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with the IPSLibrary. If not, see http://www.gnu.org/licenses/gpl.txt.
*/
/**@addtogroup ipscomponent
* @{
*
* @file IPSComponentCam_DLink.class.php
* @author Andreas Brauneis
*
*/
/**
* @class IPSComponentCam_DLink
*
* Definiert ein IPSComponentCam Object, das die Funktionen einer Cam Componente für eine
* DLink Kamera implementiert
*
* @author Andreas Brauneis
* @version
* Version 2.50.1, 26.08.2012<br/>
*/
IPSUtils_Include ('IPSComponentCam.class.php', 'IPSLibrary::app::core::IPSComponent::IPSComponentCam');
class IPSComponentCam_DLink extends IPSComponentCam {
private $ipAddress;
private $username;
private $password;
/**
* @public
*
* Initialisierung eines IPSComponentCam_DLink Objektes
*
* @param string $ipAddress IP Adresse der Kamera
* @param string $username Username für Kamera Zugriff
* @param string $password Passwort für Kamera Zugriff
*/
public function __construct($ipAddress, $username, $password) {
$this->ipAddress = $ipAddress;
$this->username = $username;
$this->password = $password;
}
/**
* @public
*
* Funktion liefert String IPSComponent Constructor String.
* String kann dazu benützt werden, das Object mit der IPSComponent::CreateObjectByParams
* wieder neu zu erzeugen.
*
* @return string Parameter String des IPSComponent Object
*/
public function GetComponentParams() {
return get_class($this).','.$this->instanceId;
}
/**
* @public
*
* Function um Events zu behandeln, diese Funktion wird vom IPSMessageHandler aufgerufen, um ein aufgetretenes Event
* an das entsprechende Module zu leiten.
*
* @param integer $variable ID der auslösenden Variable
* @param string $value Wert der Variable
* @param IPSModuleCam $module Module Object an das das aufgetretene Event weitergeleitet werden soll
*/
public function HandleEvent($variable, $value, IPSModuleCam $module) {
$name = IPS_GetName($variable);
throw new IPSComponentException('Event Handling NOT supported for Variable '.$variable.'('.$name.')');
}
/**
* @public
*
* Liefert URL des Kamera Live Streams
*
* @param integer $size Größe des Streams, mögliche Werte:
* IPSCOMPONENTCAM_SIZE_SMALL, IPSCOMPONENTCAM_SIZE_MIDDLE oder IPSCOMPONENTCAM_SIZE_LARGE
* @return string URL des Streams
*/
public function Get_URLLiveStream($size=IPSCOMPONENTCAM_SIZE_MIDDLE) {
$url = 'http://'.$this->username.':'.$this->password.'@'.$this->ipAddress.'/video.cgi?resolution=VGA';
switch ($size) {
case IPSCOMPONENTCAM_SIZE_SMALL:
$url .= ''; // Not supported
break;
case IPSCOMPONENTCAM_SIZE_MIDDLE:
$url .= ''; // Not supported
break;
case IPSCOMPONENTCAM_SIZE_LARGE:
$url .= ''; // Not supported
break;
default:
trigger_error('Unknown Size '.$size);
}
return $url;
}
/**
* @public
*
* Liefert URL des Kamera Bildes
*
* @param integer $size Größe des Bildes, mögliche Werte:
* IPSCOMPONENTCAM_SIZE_SMALL, IPSCOMPONENTCAM_SIZE_MIDDLE oder IPSCOMPONENTCAM_SIZE_LARGE
* @return string URL des Bildes
*/
public function Get_URLPicture($size=IPSCOMPONENTCAM_SIZE_MIDDLE) {
$url = 'http://'.$this->username.':'.$this->password.'@'.$this->ipAddress.'/image/jpeg.cgi';
switch ($size) {
case IPSCOMPONENTCAM_SIZE_SMALL:
$url .= ''; // Not supported
break;
case IPSCOMPONENTCAM_SIZE_MIDDLE:
$url .= ''; // Not supported
break;
case IPSCOMPONENTCAM_SIZE_LARGE:
$url .= ''; // Not supported
break;
default:
trigger_error('Unknown Size '.$size);
}
return $url;
}
/**
* @public
*
* Bewegen der Kamera
*
* @param integer $urlType Type der URL die geliefert werden soll.
* mögliche Werte: IPSCOMPONENTCAM_URL_MOVEHOME
IPSCOMPONENTCAM_URL_MOVELEFT
IPSCOMPONENTCAM_URL_MOVERIGHT
IPSCOMPONENTCAM_URL_MOVEUP
IPSCOMPONENTCAM_URL_MOVEDOWN
IPSCOMPONENTCAM_URL_PREDEFPOS1
IPSCOMPONENTCAM_URL_PREDEFPOS2
IPSCOMPONENTCAM_URL_PREDEFPOS3
IPSCOMPONENTCAM_URL_PREDEFPOS4
IPSCOMPONENTCAM_URL_PREDEFPOS5
*/
public function Get_URL($urlType) {
$url = '';
switch ($urlType) {
case IPSCOMPONENTCAM_URL_MOVELEFT:
case IPSCOMPONENTCAM_URL_MOVERIGHT:
case IPSCOMPONENTCAM_URL_MOVEUP:
case IPSCOMPONENTCAM_URL_MOVEDOWN:
case IPSCOMPONENTCAM_URL_MOVEHOME:
case IPSCOMPONENTCAM_URL_PREDEFPOS1:
case IPSCOMPONENTCAM_URL_PREDEFPOS2:
case IPSCOMPONENTCAM_URL_PREDEFPOS3:
case IPSCOMPONENTCAM_URL_PREDEFPOS4:
case IPSCOMPONENTCAM_URL_PREDEFPOS5:
$url = $url.''; // Not supported
break;
default:
trigger_error('Diese Funktion ist für eine DLink Kamera noch NICHT implementiert !!!');
}
return $url;
}
/**
* @public
*
* Liefert Breite des Kamera Bildes
*
* @param integer $size Größe des Bildes, mögliche Werte:
* IPSCOMPONENTCAM_SIZE_SMALL, IPSCOMPONENTCAM_SIZE_MIDDLE oder IPSCOMPONENTCAM_SIZE_LARGE
* @return integer Breite des Bildes in Pixel
*/
public function Get_Width($size=IPSCOMPONENTCAM_SIZE_MIDDLE) {
switch ($size) {
case IPSCOMPONENTCAM_SIZE_SMALL:
$return = 320;
break;
case IPSCOMPONENTCAM_SIZE_MIDDLE:
$return = 640;
break;
case IPSCOMPONENTCAM_SIZE_LARGE:
$return = 1024;
break;
default:
trigger_error('Unknown Size '.$size);
}
return $return;
}
/**
* @public
*
* Liefert Höhe des Kamera Bildes
*
* @param integer $size Größe des Bildes, mögliche Werte:
* IPSCOMPONENTCAM_SIZE_SMALL, IPSCOMPONENTCAM_SIZE_MIDDLE oder IPSCOMPONENTCAM_SIZE_LARGE
* @return integer Höhe des Bildes in Pixel
*/
public function Get_Height($size=IPSCOMPONENTCAM_SIZE_MIDDLE) {
switch ($size) {
case IPSCOMPONENTCAM_SIZE_SMALL:
$return = 240;
break;
case IPSCOMPONENTCAM_SIZE_MIDDLE:
$return = 480;
break;
case IPSCOMPONENTCAM_SIZE_LARGE:
$return = 768;
break;
default:
trigger_error('Unknown Size '.$size);
}
return $return;
}
}
/** @}*/
?>
Hallo Brownson,
wäre es möglich in zukünftigen Versionen von IPSCam der API-Funktion „IPSCam_StorePicture()“ folgende Rückgabewerte zu geben:
Fehler: false
Erfolg: vollständiger Pfad zum Bild
Der Hintergrund ist, dass ich das gespeicherte Bild häufig weiterverarbeite.
Was würde dagegen sprechen?
tolles Tool was Du da entwickelt hast, nutze es seit wenigen Tagen und bin sehr zufrieden.
Eine Frage habe ich allerdings noch, man kann ja in der config die Größe der Streams wunderbar einstellen, kann man auch irgendwo die Größe des Fotos (beim Aufruf der CAM-Seite) einstellen? Also die Größe im Webfront, nicht die tatsächliche Größe des Bildes.
Hallo Brownson,
da hat sich ein kleiner „Schönheitsfehler“ eingeschlichen.
Die IPS_GetKernelDir() gibt einen Pfad mit „“ am Ende zurück.
Folglich ist ein „“ zuviel im Pfad:
Die meisten Dateifunktionen können jedoch mit zwei Slashes in Folge umgehen.
P.S.: Dieser „Schönheitsfehler“ ist übrigens auch in folgenden Dateien enthalten:
IPSCam_Installation.ips.php
IPSModuleManager_Installation.ips.php
IPSLibrary_Migration.ips.php
EDIT: Habs, diese URL brauchs in der IPSComponentCam_instar: $url = ‚http://‘.$this->ipAddress.’/cgi-bin/hi3510/mjpegstream.cgi?-chn=11&-usr=’.$this->username.’&-pwd=’.$this->password;
Hallo zusammen
Ich habe jetzt meine Kamera auf der Terrasse ausgetauscht. Jetzt hängt dort eine Foscam FI9804W.
Leider bekomme ich kein Bild im Webfront.
Hier meine Config
kann ich Dich nochmals mit meiner Frage „quälen“: „… man kann ja in der config die Größe der Streams wunderbar einstellen, kann man auch irgendwo die Größe des Fotos (beim Aufruf der CAM-Seite) einstellen? Also die Größe im Webfront, nicht die tatsächliche Größe des Bildes…“.
Hast Du so etwas geplant? Ich hätte halt gern das Bild nicht auf die verfügbare Browserbreite sondern „lieber kleiner“ - möglichst Deiner Lösung beim Stream ;-))
Die Größe der Bilder kann man im WebFront nicht explizit einstellen, sie ergibt sich durch die tatsächliche Größe des Bildes.
Die gewünschte Größe der Streams bzw. auch der Bilder kann man über das WebFront vorgeben (S,M und L). Die IPSComponentCam_XXX sollte das Bild/Stream dann in der gewünschten Größe laden.
Insofern vermute ich das Problem mal in der Komponente zur Anbindung der Cam. Hab das bei meinen Cams (Vivotek und Axis) mehr oder weniger hinbekommen, ist halt immer die Frage ob eine Doku für die Cam vorhanden ist…
Hallo!
Seit einer ganzen Weile lese ich hier im Forum schon mit und bin zunehmend begeistert.
Für mich ist IPS überwiegend zum Visualisieren von PoKeys wichtig (ein tolles Ding das ich Dank diesem Forum gefunden und eingebunden bekommen habe - vielen Dank nochmals an dieser Stelle!)
Nun wollte ich an meinen Rasberry Pi welcher als Squeezebox fungiert noch eine RaspiCam anschließen.
Die Installation von IPSCam hat auch einwandfrei funktioniert und im WebFront klappt alles für meine Ansprüche wunderbar! Nur auf dem Handy und Tablet krieg ich den Live-Stream mit der IPS App nicht angezeigt. Es geht nur eine schwarze Box auf und ich habe keine Ideen mehr was ich noch ändern könnte!
Die Daten werden vom Raspi mit der Software MPJG-Streamer geliefert.
Hat jemand eine Idee wie ich das auch mit der IPS-App auf Android zum Laufen kriege? Auf dem Computer wird unter Mobile auch alles korrekt dargestellt!
Vielen Dank im Voraus!
heute ist mir so ein Teil ins Haus getrudelt. 32,95€ incl. Versand aus Deutschland - Container steht scheinbar in Hamburg
Ist leider nicht ganz baugleich mit der Foscam.
Stream und Bild gehen schon mal. Bastle gerade eine Class zusammen.
Hatte nur eine Frage im Config File wenn ich IPSCAM_PROPERTY_TYPE => IPSCAM_TYPE_MOVABLECAM, angebe. Werden dann die PTZ - Variablen automatisch angelegt? Kann sie leider nicht finden.
Hallo
Diese haengenden Threads hab ich auch , aber seltener.
Ich speichere alle 30 Minuten Bilder von 4 Kameras in die History.
Kommt so alle paar Tage ein haengender Thread dazu.
Ich meine das Problem liegt im CURL-Aufruf.
Da gibt es nur ein Timeout fuer den Verbindungsaufbau
ich halte es nach wie vor für den falschen Lösungsansatz für das Problem. Sehe auch keinen wirklichen Sinn darin, dass man mehrere Bilder pro Sekunde speichern kann…
Ich würde eher in die Richtung gehen, dass man den Fehler schluckt oder besser gleich im vorhinein verhindert - zb durch einen Semaphore:
private function StorePicture($cameraIdx, $directoryName, $size, $fileName=null, $fileName2=null) {
if (!$this->IsCameraAvailable($cameraIdx)) {
return false;
}
$result = IPS_SemaphoreEnter('IPSCam_'.$cameraIdx, 500);
if ($result) {
$componentParams = $this->config[$cameraIdx][IPSCAM_PROPERTY_COMPONENT];
$component = IPSComponent::CreateObjectByParams($componentParams);
$urlPicture = $component->Get_URLPicture($size);
if ($fileName == null) {
$fileName = date(IPSCAM_NAV_DATEFORMATFILE);
}
$localFile = IPS_GetKernelDir().'Cams/'.$cameraIdx.'/'.$directoryName.'/'.$fileName.'.jpg';
$localFile2 = IPS_GetKernelDir().'Cams/'.$cameraIdx.'/'.$directoryName.'/'.$fileName2.'.jpg';
IPSLogger_Trc(__file__, "Copy $urlPicture --> $localFile");
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $urlPicture);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_handle, CURLOPT_FAILONERROR, true);
$fileContent = curl_exec($curl_handle);
if ($fileContent===false) {
IPSLogger_Dbg (__file__, 'File '.$urlPicture.' could NOT be found on the Server !!!');
return false;
}
curl_close($curl_handle);
$result = file_put_contents($localFile, $fileContent);
if ($result===false) {
trigger_error('Error writing File Content to '.$localFile);
}
if ($fileName2!==null) {
$result = file_put_contents($localFile2, $fileContent);
if ($result===false) {
trigger_error('Error writing File Content to '.$localFile2);
}
}
IPS_SemaphoreLeave('IPSCam_'.$cameraIdx);
return $localFile;
}
return false;
}
Der Meinung bin ich auch!
Arbeite in meinen Skripts auch mit Semaphoren, damit dieser Fall nicht auftreten kann. Beispielsweise Klingel, Briefeinwurf,…
die Lösung mit einer Semaphore geht natürlich auch, dann kann aber nur noch ein Bild in der Sekunde gespeichert werden.
Aber damit kann ich auch leben
Ich habe deinen Vorschlag nun zum Test eingebaut.