IPSCam

Hallo zusammen,

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?

Hab das mal auf die Schnelle implementiert, die Funktion gibt nun den Pfad + Namen des gespeicherten Bildes zurück

Hallo Brownson,

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.

Herbert

Super! Vielen Dank!

Moinsen,

hat einer von euch die Foscam 9805E/W im Einsatz und kann ein paar Takte drüber erzählen? Bild, IPSCam, generelle Zufriedenheit.

In anderen Foren ist sie als OK/Gut bzezeichnet worden, aber wenns mit IPS z.B. gar nicht will … überlege ich mir den Kauf :smiley:

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:

			$localFile        = IPS_GetKernelDir().'\\Cams\\'.$cameraIdx.'\\'.$directoryName.'\\'.$fileName.'.jpg';
			$localFile2       = IPS_GetKernelDir().'\\Cams\\'.$cameraIdx.'\\'.$directoryName.'\\'.$fileName2.'.jpg';

Sollte wie folgt aussehen:

			$localFile        = IPS_GetKernelDir().'Cams\\'.$cameraIdx.'\\'.$directoryName.'\\'.$fileName.'.jpg';
			$localFile2       = IPS_GetKernelDir().'Cams\\'.$cameraIdx.'\\'.$directoryName.'\\'.$fileName2.'.jpg';

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

ja, richtig, werde im Zuge der Umstellung auf OSX/Linux ohnehin auf diesem Gebiet auch noch mehrfach nachbessern müssen

Jemand die Instar 5907 schon ans laufen gebracht? Die Mjpeg URL lautet: http://x.x.x.x/tmpfs/snap.jpg?1404843208751

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

[b]3    => array(IPSCAM_PROPERTY_NAME        => 'Terrasse',
                 IPSCAM_PROPERTY_TYPE        => IPSCAM_TYPE_FIXEDCAM,
                      IPSCAM_PROPERTY_COMPONENT   => 'IPSComponentCam_Foscam89x,192.168.xxx.xx,Benutzer,',
                          ),
[/b]


Ich habe auch schon mal die anderen Kamera Typen ausprobiert leider ohne Erfolg.
Ich hoffe es kann mir Jemand einen Tip geben.

Mfg Stefan

Hi Brownson,

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 ;-))

Beste Grüße
Herbertf

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 zusammen

Ich wollte nochmal Nachfragen ob denn Jemand die Foscam 9804 in IPSCam erfolgreich eingebunden hat.

Mfg Stefan

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!

Hallo,

heute ist mir so ein Teil ins Haus getrudelt. 32,95€ incl. Versand aus Deutschland - Container steht scheinbar in Hamburg :slight_smile:
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.

Viele Grüße
Andreas

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

			curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);

Hab bei mir mal eingebaut

			curl_setopt($curl_handle, CURLOPT_TIMEOUT, xxxx);

Mal sehen obs besser wird.
Das Problem ist hier geloest worden:
http://www.ip-symcon.de/forum/threads/20484-Im-WWWReader-ein-Cookie-hinterlegen?p=187821#post187821

Hallo Andreas,

ich möchte gerne noch einmal dieses Thema aufgreifen:

Es wäre schön, wenn du die Änderungen übernehmen könntest, damit sie beim nächsten Update nicht verloren sind.

Viele Grüße

Burkhard

Hallo Burkhard,

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

Hallo Andreas,

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 :slight_smile:
Ich habe deinen Vorschlag nun zum Test eingebaut.

Viele Grüße

Burkhard