Teil 1 dieses Themas beschäftigt sich mit der Anbindung der Kamera in IP-Symcon.

Folgende Objekte werden in IP-Symcon benötigt:

  • MediaStream – Livestream der Kamera
  • MediaImage – Image der Kamera
  • Refresh Script – Skript das das Image der Kamera aktualisiert
  • Refresh Timer – Timer der periodisch das Image der Kamera aktualisiert

Das MediaStream Objekt kann man ganz einfach in der IP-Symcon Konsole anlegen, die Dokumentation hierzu findet man in der IP-Symcon Doku: Medien

Für das MediaImage benötigt man einige Zeilen PHP. Anbei ein kleines Skript, das ein MediaImage anlegt, das zugehörige Bild von der Kamera lädt und auch gleich einen Timer zum Refresh des Images anlegt.

Als Konfigurationsparameter muss man die URL des Kamerabildes angeben. Diese URL findet man in der Dokumentation der Kamera oder im Internet.

<?
	/**
	 * @file          IPSView_CameraImageRefresh.ips.php
	 * @author        brownson
	 * @version
	 *   Version 1.0, 2015-05-02 brownson: Initiale Version<br/>
	 *
	 * Skript um ein MediaImage einer Kamera zu erzeugen und periodisch zu 
         * aktualisieren
	 *
	 * Konfiguration Einstellungen:
	 *   CAM_IMAGE_URL       ... URL des Kamera Bildes
	 *   CAM_NAME            ... Name der Kamera
	 *   CAM_REFRESH_SEC     ... Aktualisierungsinterval in Sekunden
	 *
	 */

	/*
	 * Konfiguration:
	 * -------------------------------------------------------------------------
	 */

	define ('CAM_IMAGE_URL',	   'http://x.x.x.x/UrlCamImage');
	define ('CAM_NAME',			   'NameDerKamera');
	define ('CAM_REFRESH_SEC',	   300);

	/*
	 * Programmlogik:
	 * -------------------------------------------------------------------------
	 */
	$scriptID      = $_IPS['SELF'];
	$sender        = $_IPS['SENDER'];
	$parentID      = IPS_GetParent($scriptID);

	$filename = IPS_GetKernelDir().'media/'.CAM_NAME.'.jpg';
	$mediaID  = CreateMedia ('Image', $parentID, $filename);
   CreateTimer_CyclicBySeconds ('RefreshTimer', $scriptID, CAM_REFRESH_SEC);

	$curl_handle=curl_init();
	curl_setopt($curl_handle, CURLOPT_URL, CAM_IMAGE_URL);
	curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 3);
	curl_setopt($curl_handle, CURLOPT_TIMEOUT, 3);
	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);
	curl_close($curl_handle);

	if ($fileContent===false) {
		IPS_LogMessage(__file__, 'File "'.CAM_IMAGE_URL.'" could NOT be found on the Server !!!');
		return;
	}
	$result = file_put_contents($filename, $fileContent);
	if ($result===false) {
		IPS_Sleep(1000);
		$result = file_put_contents($filename, $fileContent);
	}
	if ($result===false) {
		IPS_LogMessage(__file__, 'Error writing File Content to '.$filename);
		return;
	}

	/*
	 * Funktionen:
	 * -------------------------------------------------------------------------
	 */

	function CreateMedia ($Name, $ParentId, $FileName) {
		$MediaId = @IPS_GetMediaIDByName($Name, $ParentId);
		if ($MediaId === false) {
			$MediaId	= IPS_CreateMedia(1);
			IPS_SetParent($MediaId, $ParentId);
			IPS_SetName($MediaId, $Name);
			IPS_SetPosition($MediaId, 0);
		}
		IPS_SetMediaFile($MediaId, $FileName, false);
		return $MediaId;
	}

	function CreateTimer_CyclicBySeconds ($name, $parentId, $seconds) {
		$timerId = @IPS_GetObjectIDByIdent($name, $parentId);
		if ($timerId === false) {
 			$timerId = IPS_CreateEvent(1 /*Cyclic Event*/);
			IPS_SetParent($timerId, $parentId);
			IPS_SetName($timerId, $name);
			IPS_SetIdent($timerId, $name);
			if (!IPS_SetEventCyclic($timerId, 2 /*Daily*/, 1 /*Int*/,0 /*Days*/,0/*DayInt*/,1/*TimeType Sec*/,$seconds/*Sec*/)) {
				die ("IPS_SetEventCyclic failed !!!");
			}
			IPS_SetEventActive($timerId, true);
			echo 'Created Timer '.$name.'='.$timerId."".PHP_EOL;
		}
		return $timerId;
	}

?>

 

Aktualisierung des Bildes mit automatischer Anpassung der Größe:

Wenn die Kamera nur Bilder in hoher Auflösung liefert, kann man das Image auch noch verkleinern, damit man bei der Übertragung auf mobile Endgeräte schneller ein Bild hat:

<?
     /**
      * @file          IPSView_CameraImageRefreshResized.ips.php
      * @author        brownson
      * @version
      *   Version 1.0, 2015-05-02 brownson: Initiale Version<br/>
      *
      * Skript um ein MediaImage einer Kamera zu erzeugen und periodisch zu 
         * aktualisieren
      *
      * Konfiguration Einstellungen:
      *   CAM_IMAGE_URL          ... URL des Kamera Bildes
      *   CAM_NAME               ... Name der Kamera
      *   CAM_REFRESH_SEC        ... Aktualisierungsinterval in Sekunden
      *   CAM_IMAGE_HEIGHT       ... Höhe des orignall Bildes in Pixel
      *   CAM_IMAGE_WIDTH        ... Breite des orignall Bildes in Pixel
      *   CAM_IMAGE_RESIZERATIO  ... Faktor um den verkleinert werden soll
      *
      */
      
     /*
      * Konfiguration:
      * -------------------------------------------------------------------------
      */

     define ('CAM_IMAGE_URL',        'http://x.x.x.x/UrlCamImage');
     define ('CAM_NAME',             'NameDerKamera');
     define ('CAM_REFRESH_SEC',      300);
     define ('CAM_IMAGE_WIDTH',      2048);
     define ('CAM_IMAGE_HEIGHT',     1536);
     define ('CAM_IMAGE_RESIZERATIO',3);

     /*
      * Programmlogik:
      * -------------------------------------------------------------------------
      */
     $scriptID      = $_IPS['SELF'];
     $sender        = $_IPS['SENDER'];
     $parentID      = IPS_GetParent($scriptID);

     $filenameSmall = IPS_GetKernelDir().'media/'.CAM_NAME.'.jpg';
     $filenameLarge = IPS_GetKernelDir().'media/'.CAM_NAME.'Large.jpg';
     $mediaIDSmall  = CreateMedia ('ImageSmall', $parentID, $filenameSmall);
     $mediaIDLarge  = CreateMedia ('ImageLarge', $parentID, $filenameLarge);
     CreateTimer_CyclicBySeconds ('RefreshTimer', $scriptID, 
                                  CAM_REFRESH_SEC);

     $curl_handle=curl_init();
     curl_setopt($curl_handle, CURLOPT_URL, CAM_IMAGE_URL);
     curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 3);
     curl_setopt($curl_handle, CURLOPT_TIMEOUT, 3);
     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);
     curl_close($curl_handle);

     if ($fileContent===false) {
          IPS_LogMessage(__file__, 'File "'.CAM_IMAGE_URL.'" could NOT be found on the Server !!!');
          return;
     }
     $result = file_put_contents($filenameLarge, $fileContent);
     if ($result===false) {
          IPS_Sleep(1000);
          $result = file_put_contents($filenameLarge, $fileContent);
     }
     if ($result===false) {
          IPS_LogMessage(__file__, 'Error writing File Content to '.$filenameLarge);
          return;
     }

     $thumb = imagecreatetruecolor(CAM_IMAGE_WIDTH/CAM_IMAGE_RESIZERATIO,
                                   CAM_IMAGE_HEIGHT/CAM_IMAGE_RESIZERATIO);
     $source = imagecreatefromjpeg($filenameLarge);
     imagecopyresized($thumb, $source, 0, 0, 0, 0,
                    CAM_IMAGE_WIDTH/CAM_IMAGE_RESIZERATIO,
                              CAM_IMAGE_HEIGHT/CAM_IMAGE_RESIZERATIO,
                              CAM_IMAGE_WIDTH, CAM_IMAGE_HEIGHT);
     imagejpeg($thumb, $filenameSmall);


     /*
      * Funktionen:
      * -------------------------------------------------------------------------
      */

     function CreateMedia ($Name, $ParentId, $FileName) {
          $MediaId = @IPS_GetMediaIDByName($Name, $ParentId);
          if ($MediaId === false) {
               $MediaId     = IPS_CreateMedia(1);
               IPS_SetParent($MediaId, $ParentId);
               IPS_SetName($MediaId, $Name);
               IPS_SetPosition($MediaId, 0);
          }
          IPS_SetMediaFile($MediaId, $FileName, false);
          return $MediaId;
     }

     function CreateTimer_CyclicBySeconds ($name, $parentId, $seconds) {
          $timerId = @IPS_GetObjectIDByIdent($name, $parentId);
          if ($timerId === false) {
                $timerId = IPS_CreateEvent(1 /*Cyclic Event*/);
               IPS_SetParent($timerId, $parentId);
               IPS_SetName($timerId, $name);
               IPS_SetIdent($timerId, $name);
               if (!IPS_SetEventCyclic($timerId, 2 /*Daily*/, 1 /*Int*/,0 /*Days*/,
                                       0/*DayInt*/,1/*TimeType Sec*/,$seconds/*Sec*/)) {
                    die ("IPS_SetEventCyclic failed !!!");
               }
               IPS_SetEventActive($timerId, true);
               echo 'Created Timer '.$name.'='.$timerId."".PHP_EOL;
          }
          return $timerId;
     }

?>

 

Lichtschalter mit automatischer Aktualisierung des Kamerabildes:

Als zusätzliche Option kann man sich auch noch einige Lichtschalter definieren, die bei einem Schaltvorgang des Lichtes automatisch das Bild der Kamera aktualisieren.

Im Konfigurationsteil des Skriptes hinterlegt man einfach die ID des Skriptes zum Aktualisieren des Kamera Bildes und die ID der Variable, die man schalten möchte.

Das Skript legt dann automatisch eine zusätzliche Variable zum Schalten des Lichtes an und auch ein Event auf die ursprüngliche Variable um den Status immer aktuell zu halten.

<?
	/**
	 * @file          IPSView_CameraLightPergola.ips.php
	 * @author        brownson
	 * @version
	 *   Version 1.0, 2015-05-10 brownson: Initiale Version<br/>
	 *
	 * Skript ein Licht zu schalten und danach das Image einer Kamera zu
	 * aktualisieren.
	 *
	 *
	 * Konfiguration Einstellungen:
	 *   CAM_REFRESH_SCRIPT_ID       ... Skript ID zum Refresh des Kamera Bildes
	 *   CAM_LIGHT_SWITCH_ID         ... ID des Licht Schalters (der Instanz)
	 *   CAM_LIGHT_SWITCH_NAME       ... Name des Lichtes
	 *
	 */

	/*
	 * Konfiguration:
	 * ---------------------------------------------------------------------
	 */

	define ('CAM_REFRESH_SCRIPT_ID',       12345);
	define ('CAM_LIGHT_SWITCH_ID',         23456);
	define ('CAM_LIGHT_SWITCH_NAME',       'Pergola');

	/*
	 * Programmlogik:
	 * ---------------------------------------------------------------------
	 */

	$scriptID     = $_IPS['SELF'];
	$sender       = $_IPS['SENDER'];
	$parentID     = IPS_GetParent($scriptID);

	// Manuelles Ausführen in der Konsole
	// --> erzeugen der Variable und des Events für die Synchronisierung
	if ($sender=='Execute') {
 	   $variableID = CreateVariable (CAM_LIGHT_SWITCH_NAME, 0, $parentID, 0, '~Switch', $scriptID);
	   $eventID    = CreateEvent(CAM_LIGHT_SWITCH_NAME, CAM_LIGHT_SWITCH_ID, $scriptID);
  
	// Sync des Schalters durch die verlinkte Variable
	} elseif ($sender=='Variable') {
		$variableIdEvent   = $_IPS['VARIABLE'];
		$eventID           = $_IPS['EVENT'];
		$eventName         = IPS_GetName($eventID);
		$variableID        = IPS_GetVariableIDByName($eventName, $parentID);
		if (GetValue($variableIdEvent) <> GetValue($variableID))
			SetValue($variableID , GetValue($variableIdEvent));

	// Schalten des Lichtes durch den Kamera Lichtschalter und refresh
	// des Kamera Bildes
	} else {
		$variableId   = $_IPS['VARIABLE'];
		
		// Lichtschalter Kamera
		SetValue($variableId, !GetValue($variableId));
		
		// Schalten der Instanz
		$instanceID = IPS_GetParent(CAM_LIGHT_SWITCH_ID);
		$ident      = IPS_GetObject(CAM_LIGHT_SWITCH_ID)['ObjectIdent'];
		IPS_RequestAction($instanceID, $ident, GetValue($variableId));

		// Kurzes Warten auf das eigenliche Schalten des Lichtes
		IPS_Sleep(200);
		
		// Refresh des eigentlichen Kamera Lichtes
		IPS_RunScript(CAM_REFRESH_SCRIPT_ID);
	}

	function CreateVariable ($name, $type, $parentId, $position=0, $profile="", $action=null) {
		$variableId = @IPS_GetVariableIDByName($name, $parentId);
		if ($variableId === false) {
 			$variableId = IPS_CreateVariable($type);
			IPS_SetParent($variableId, $parentId);
			IPS_SetName($variableId, $name);
			IPS_SetIdent($variableId, $name);
			IPS_SetPosition($variableId, $position);
  			IPS_SetVariableCustomProfile($variableId, $profile);
 			IPS_SetVariableCustomAction($variableId, $action);
		}
		return $variableId;
	}

	function CreateEvent ($name, $variableId, $scriptId) {
		$eventId = @IPS_GetEventIDByName($name, $scriptId);
		if ($eventId === false) {
			$eventId = IPS_CreateEvent(0);
			IPS_SetParent($eventId, $scriptId);
			IPS_SetName($eventId, $name);
			IPS_SetIdent($eventId, $name);
			IPS_SetEventTrigger($eventId, 1/*ByChange*/, $variableId);
			IPS_SetEventActive($eventId, true);
  		}
		return $eventId;
	}


?>

 

Die Einbindung der Kameras in IPSView ist in Teil 2 dieses Themas zu finden