{"id":558,"date":"2015-05-19T21:30:36","date_gmt":"2015-05-19T20:30:36","guid":{"rendered":"http:\/\/ipsview.brownson.at\/?p=558"},"modified":"2015-05-19T21:35:38","modified_gmt":"2015-05-19T20:35:38","slug":"anbindung-einer-kamera-teil-1","status":"publish","type":"post","link":"https:\/\/ipsview.brownson.at\/?p=558","title":{"rendered":"Anbindung einer Kamera \u2013 Teil 1"},"content":{"rendered":"<p>Teil 1 dieses Themas besch\u00e4ftigt sich mit der Anbindung der Kamera in IP-Symcon.<\/p>\n<p><span style=\"text-decoration: underline;\">Folgende Objekte werden in IP-Symcon ben\u00f6tigt:<\/span><\/p>\n<ul>\n<li>MediaStream \u2013 Livestream der Kamera<\/li>\n<li>MediaImage \u2013 Image der Kamera<\/li>\n<li>Refresh Script \u2013 Skript das das Image der Kamera aktualisiert<\/li>\n<li>Refresh Timer \u2013 Timer der periodisch das Image der Kamera aktualisiert<\/li>\n<\/ul>\n<p>Das MediaStream Objekt kann man ganz einfach in der IP-Symcon Konsole anlegen, die Dokumentation hierzu findet man in der IP-Symcon Doku:\u00a0<a href=\"https:\/\/www.symcon.de\/service\/dokumentation\/konzepte\/medien\/\" target=\"_blank\">Medien<\/a><\/p>\n<p>F\u00fcr das MediaImage ben\u00f6tigt man einige Zeilen PHP. Anbei ein kleines Skript, das ein MediaImage anlegt, das zugeh\u00f6rige Bild von der Kamera l\u00e4dt und auch gleich einen Timer zum Refresh des Images anlegt.<\/p>\n<p>Als Konfigurationsparameter muss man die URL des Kamerabildes angeben. Diese URL findet man in der Dokumentation der Kamera oder im Internet.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-title=\"\">&lt;?\r\n\t\/**\r\n\t * @file          IPSView_CameraImageRefresh.ips.php\r\n\t * @author        brownson\r\n\t * @version\r\n\t *   Version 1.0, 2015-05-02 brownson: Initiale Version&lt;br\/&gt;\r\n\t *\r\n\t * Skript um ein MediaImage einer Kamera zu erzeugen und periodisch zu \r\n         * aktualisieren\r\n\t *\r\n\t * Konfiguration Einstellungen:\r\n\t *   CAM_IMAGE_URL       ... URL des Kamera Bildes\r\n\t *   CAM_NAME            ... Name der Kamera\r\n\t *   CAM_REFRESH_SEC     ... Aktualisierungsinterval in Sekunden\r\n\t *\r\n\t *\/\r\n\r\n\t\/*\r\n\t * Konfiguration:\r\n\t * -------------------------------------------------------------------------\r\n\t *\/\r\n\r\n\tdefine (&#039;CAM_IMAGE_URL&#039;,\t   &#039;http:\/\/x.x.x.x\/UrlCamImage&#039;);\r\n\tdefine (&#039;CAM_NAME&#039;,\t\t\t   &#039;NameDerKamera&#039;);\r\n\tdefine (&#039;CAM_REFRESH_SEC&#039;,\t   300);\r\n\r\n\t\/*\r\n\t * Programmlogik:\r\n\t * -------------------------------------------------------------------------\r\n\t *\/\r\n\t$scriptID      = $_IPS[&#039;SELF&#039;];\r\n\t$sender        = $_IPS[&#039;SENDER&#039;];\r\n\t$parentID      = IPS_GetParent($scriptID);\r\n\r\n\t$filename = IPS_GetKernelDir().&#039;media\/&#039;.CAM_NAME.&#039;.jpg&#039;;\r\n\t$mediaID  = CreateMedia (&#039;Image&#039;, $parentID, $filename);\r\n   CreateTimer_CyclicBySeconds (&#039;RefreshTimer&#039;, $scriptID, CAM_REFRESH_SEC);\r\n\r\n\t$curl_handle=curl_init();\r\n\tcurl_setopt($curl_handle, CURLOPT_URL, CAM_IMAGE_URL);\r\n\tcurl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 3);\r\n\tcurl_setopt($curl_handle, CURLOPT_TIMEOUT, 3);\r\n\tcurl_setopt($curl_handle, CURLOPT_RETURNTRANSFER,true);\r\n\tcurl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);\r\n\tcurl_setopt($curl_handle, CURLOPT_FAILONERROR, true);\r\n\t$fileContent = curl_exec($curl_handle);\r\n\tcurl_close($curl_handle);\r\n\r\n\tif ($fileContent===false) {\r\n\t\tIPS_LogMessage(__file__, &#039;File &quot;&#039;.CAM_IMAGE_URL.&#039;&quot; could NOT be found on the Server !!!&#039;);\r\n\t\treturn;\r\n\t}\r\n\t$result = file_put_contents($filename, $fileContent);\r\n\tif ($result===false) {\r\n\t\tIPS_Sleep(1000);\r\n\t\t$result = file_put_contents($filename, $fileContent);\r\n\t}\r\n\tif ($result===false) {\r\n\t\tIPS_LogMessage(__file__, &#039;Error writing File Content to &#039;.$filename);\r\n\t\treturn;\r\n\t}\r\n\r\n\t\/*\r\n\t * Funktionen:\r\n\t * -------------------------------------------------------------------------\r\n\t *\/\r\n\r\n\tfunction CreateMedia ($Name, $ParentId, $FileName) {\r\n\t\t$MediaId = @IPS_GetMediaIDByName($Name, $ParentId);\r\n\t\tif ($MediaId === false) {\r\n\t\t\t$MediaId\t= IPS_CreateMedia(1);\r\n\t\t\tIPS_SetParent($MediaId, $ParentId);\r\n\t\t\tIPS_SetName($MediaId, $Name);\r\n\t\t\tIPS_SetPosition($MediaId, 0);\r\n\t\t}\r\n\t\tIPS_SetMediaFile($MediaId, $FileName, false);\r\n\t\treturn $MediaId;\r\n\t}\r\n\r\n\tfunction CreateTimer_CyclicBySeconds ($name, $parentId, $seconds) {\r\n\t\t$timerId = @IPS_GetObjectIDByIdent($name, $parentId);\r\n\t\tif ($timerId === false) {\r\n \t\t\t$timerId = IPS_CreateEvent(1 \/*Cyclic Event*\/);\r\n\t\t\tIPS_SetParent($timerId, $parentId);\r\n\t\t\tIPS_SetName($timerId, $name);\r\n\t\t\tIPS_SetIdent($timerId, $name);\r\n\t\t\tif (!IPS_SetEventCyclic($timerId, 2 \/*Daily*\/, 1 \/*Int*\/,0 \/*Days*\/,0\/*DayInt*\/,1\/*TimeType Sec*\/,$seconds\/*Sec*\/)) {\r\n\t\t\t\tdie (&quot;IPS_SetEventCyclic failed !!!&quot;);\r\n\t\t\t}\r\n\t\t\tIPS_SetEventActive($timerId, true);\r\n\t\t\techo &#039;Created Timer &#039;.$name.&#039;=&#039;.$timerId.&quot;&quot;.PHP_EOL;\r\n\t\t}\r\n\t\treturn $timerId;\r\n\t}\r\n\r\n?&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Aktualisierung\u00a0des Bildes mit automatischer Anpassung der Gr\u00f6\u00dfe:<\/strong><\/span><\/p>\n<p>Wenn die Kamera nur Bilder in hoher Aufl\u00f6sung liefert, kann man das Image auch noch verkleinern, damit man bei der \u00dcbertragung auf mobile Endger\u00e4te schneller ein Bild hat:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-title=\"\">&lt;?\r\n     \/**\r\n      * @file          IPSView_CameraImageRefreshResized.ips.php\r\n      * @author        brownson\r\n      * @version\r\n      *   Version 1.0, 2015-05-02 brownson: Initiale Version&lt;br\/&gt;\r\n      *\r\n      * Skript um ein MediaImage einer Kamera zu erzeugen und periodisch zu \r\n         * aktualisieren\r\n      *\r\n      * Konfiguration Einstellungen:\r\n      *   CAM_IMAGE_URL          ... URL des Kamera Bildes\r\n      *   CAM_NAME               ... Name der Kamera\r\n      *   CAM_REFRESH_SEC        ... Aktualisierungsinterval in Sekunden\r\n      *   CAM_IMAGE_HEIGHT       ... H\u00f6he des orignall Bildes in Pixel\r\n      *   CAM_IMAGE_WIDTH        ... Breite des orignall Bildes in Pixel\r\n      *   CAM_IMAGE_RESIZERATIO  ... Faktor um den verkleinert werden soll\r\n      *\r\n      *\/\r\n      \r\n     \/*\r\n      * Konfiguration:\r\n      * -------------------------------------------------------------------------\r\n      *\/\r\n\r\n     define (&#039;CAM_IMAGE_URL&#039;,        &#039;http:\/\/x.x.x.x\/UrlCamImage&#039;);\r\n     define (&#039;CAM_NAME&#039;,             &#039;NameDerKamera&#039;);\r\n     define (&#039;CAM_REFRESH_SEC&#039;,      300);\r\n     define (&#039;CAM_IMAGE_WIDTH&#039;,      2048);\r\n     define (&#039;CAM_IMAGE_HEIGHT&#039;,     1536);\r\n     define (&#039;CAM_IMAGE_RESIZERATIO&#039;,3);\r\n\r\n     \/*\r\n      * Programmlogik:\r\n      * -------------------------------------------------------------------------\r\n      *\/\r\n     $scriptID      = $_IPS[&#039;SELF&#039;];\r\n     $sender        = $_IPS[&#039;SENDER&#039;];\r\n     $parentID      = IPS_GetParent($scriptID);\r\n\r\n     $filenameSmall = IPS_GetKernelDir().&#039;media\/&#039;.CAM_NAME.&#039;.jpg&#039;;\r\n     $filenameLarge = IPS_GetKernelDir().&#039;media\/&#039;.CAM_NAME.&#039;Large.jpg&#039;;\r\n     $mediaIDSmall  = CreateMedia (&#039;ImageSmall&#039;, $parentID, $filenameSmall);\r\n     $mediaIDLarge  = CreateMedia (&#039;ImageLarge&#039;, $parentID, $filenameLarge);\r\n     CreateTimer_CyclicBySeconds (&#039;RefreshTimer&#039;, $scriptID, \r\n                                  CAM_REFRESH_SEC);\r\n\r\n     $curl_handle=curl_init();\r\n     curl_setopt($curl_handle, CURLOPT_URL, CAM_IMAGE_URL);\r\n     curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 3);\r\n     curl_setopt($curl_handle, CURLOPT_TIMEOUT, 3);\r\n     curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER,true);\r\n     curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);\r\n     curl_setopt($curl_handle, CURLOPT_FAILONERROR, true);\r\n     $fileContent = curl_exec($curl_handle);\r\n     curl_close($curl_handle);\r\n\r\n     if ($fileContent===false) {\r\n          IPS_LogMessage(__file__, &#039;File &quot;&#039;.CAM_IMAGE_URL.&#039;&quot; could NOT be found on the Server !!!&#039;);\r\n          return;\r\n     }\r\n     $result = file_put_contents($filenameLarge, $fileContent);\r\n     if ($result===false) {\r\n          IPS_Sleep(1000);\r\n          $result = file_put_contents($filenameLarge, $fileContent);\r\n     }\r\n     if ($result===false) {\r\n          IPS_LogMessage(__file__, &#039;Error writing File Content to &#039;.$filenameLarge);\r\n          return;\r\n     }\r\n\r\n     $thumb = imagecreatetruecolor(CAM_IMAGE_WIDTH\/CAM_IMAGE_RESIZERATIO,\r\n                                   CAM_IMAGE_HEIGHT\/CAM_IMAGE_RESIZERATIO);\r\n     $source = imagecreatefromjpeg($filenameLarge);\r\n     imagecopyresized($thumb, $source, 0, 0, 0, 0,\r\n                    CAM_IMAGE_WIDTH\/CAM_IMAGE_RESIZERATIO,\r\n                              CAM_IMAGE_HEIGHT\/CAM_IMAGE_RESIZERATIO,\r\n                              CAM_IMAGE_WIDTH, CAM_IMAGE_HEIGHT);\r\n     imagejpeg($thumb, $filenameSmall);\r\n\r\n\r\n     \/*\r\n      * Funktionen:\r\n      * -------------------------------------------------------------------------\r\n      *\/\r\n\r\n     function CreateMedia ($Name, $ParentId, $FileName) {\r\n          $MediaId = @IPS_GetMediaIDByName($Name, $ParentId);\r\n          if ($MediaId === false) {\r\n               $MediaId     = IPS_CreateMedia(1);\r\n               IPS_SetParent($MediaId, $ParentId);\r\n               IPS_SetName($MediaId, $Name);\r\n               IPS_SetPosition($MediaId, 0);\r\n          }\r\n          IPS_SetMediaFile($MediaId, $FileName, false);\r\n          return $MediaId;\r\n     }\r\n\r\n     function CreateTimer_CyclicBySeconds ($name, $parentId, $seconds) {\r\n          $timerId = @IPS_GetObjectIDByIdent($name, $parentId);\r\n          if ($timerId === false) {\r\n                $timerId = IPS_CreateEvent(1 \/*Cyclic Event*\/);\r\n               IPS_SetParent($timerId, $parentId);\r\n               IPS_SetName($timerId, $name);\r\n               IPS_SetIdent($timerId, $name);\r\n               if (!IPS_SetEventCyclic($timerId, 2 \/*Daily*\/, 1 \/*Int*\/,0 \/*Days*\/,\r\n                                       0\/*DayInt*\/,1\/*TimeType Sec*\/,$seconds\/*Sec*\/)) {\r\n                    die (&quot;IPS_SetEventCyclic failed !!!&quot;);\r\n               }\r\n               IPS_SetEventActive($timerId, true);\r\n               echo &#039;Created Timer &#039;.$name.&#039;=&#039;.$timerId.&quot;&quot;.PHP_EOL;\r\n          }\r\n          return $timerId;\r\n     }\r\n\r\n?&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong><span style=\"text-decoration: underline;\">Lichtschalter mit automatischer Aktualisierung des Kamerabildes:<\/span><\/strong><\/p>\n<p>Als zus\u00e4tzliche Option kann man sich auch noch einige Lichtschalter definieren, die bei einem Schaltvorgang des Lichtes automatisch das Bild der Kamera aktualisieren.<\/p>\n<p>Im Konfigurationsteil des Skriptes hinterlegt man einfach die ID des\u00a0Skriptes zum Aktualisieren des Kamera Bildes und die ID der Variable, die man schalten m\u00f6chte.<\/p>\n<p>Das Skript legt dann automatisch eine zus\u00e4tzliche Variable zum Schalten des Lichtes an und auch ein Event auf die urspr\u00fcngliche Variable um den Status immer aktuell zu halten.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-title=\"\">&lt;?\r\n\t\/**\r\n\t * @file          IPSView_CameraLightPergola.ips.php\r\n\t * @author        brownson\r\n\t * @version\r\n\t *   Version 1.0, 2015-05-10 brownson: Initiale Version&lt;br\/&gt;\r\n\t *\r\n\t * Skript ein Licht zu schalten und danach das Image einer Kamera zu\r\n\t * aktualisieren.\r\n\t *\r\n\t *\r\n\t * Konfiguration Einstellungen:\r\n\t *   CAM_REFRESH_SCRIPT_ID       ... Skript ID zum Refresh des Kamera Bildes\r\n\t *   CAM_LIGHT_SWITCH_ID         ... ID des Licht Schalters (der Instanz)\r\n\t *   CAM_LIGHT_SWITCH_NAME       ... Name des Lichtes\r\n\t *\r\n\t *\/\r\n\r\n\t\/*\r\n\t * Konfiguration:\r\n\t * ---------------------------------------------------------------------\r\n\t *\/\r\n\r\n\tdefine (&#039;CAM_REFRESH_SCRIPT_ID&#039;,       12345);\r\n\tdefine (&#039;CAM_LIGHT_SWITCH_ID&#039;,         23456);\r\n\tdefine (&#039;CAM_LIGHT_SWITCH_NAME&#039;,       &#039;Pergola&#039;);\r\n\r\n\t\/*\r\n\t * Programmlogik:\r\n\t * ---------------------------------------------------------------------\r\n\t *\/\r\n\r\n\t$scriptID     = $_IPS[&#039;SELF&#039;];\r\n\t$sender       = $_IPS[&#039;SENDER&#039;];\r\n\t$parentID     = IPS_GetParent($scriptID);\r\n\r\n\t\/\/ Manuelles Ausf\u00fchren in der Konsole\r\n\t\/\/ --&gt; erzeugen der Variable und des Events f\u00fcr die Synchronisierung\r\n\tif ($sender==&#039;Execute&#039;) {\r\n \t   $variableID = CreateVariable (CAM_LIGHT_SWITCH_NAME, 0, $parentID, 0, &#039;~Switch&#039;, $scriptID);\r\n\t   $eventID    = CreateEvent(CAM_LIGHT_SWITCH_NAME, CAM_LIGHT_SWITCH_ID, $scriptID);\r\n  \r\n\t\/\/ Sync des Schalters durch die verlinkte Variable\r\n\t} elseif ($sender==&#039;Variable&#039;) {\r\n\t\t$variableIdEvent   = $_IPS[&#039;VARIABLE&#039;];\r\n\t\t$eventID           = $_IPS[&#039;EVENT&#039;];\r\n\t\t$eventName         = IPS_GetName($eventID);\r\n\t\t$variableID        = IPS_GetVariableIDByName($eventName, $parentID);\r\n\t\tif (GetValue($variableIdEvent) &lt;&gt; GetValue($variableID))\r\n\t\t\tSetValue($variableID , GetValue($variableIdEvent));\r\n\r\n\t\/\/ Schalten des Lichtes durch den Kamera Lichtschalter und refresh\r\n\t\/\/ des Kamera Bildes\r\n\t} else {\r\n\t\t$variableId   = $_IPS[&#039;VARIABLE&#039;];\r\n\t\t\r\n\t\t\/\/ Lichtschalter Kamera\r\n\t\tSetValue($variableId, !GetValue($variableId));\r\n\t\t\r\n\t\t\/\/ Schalten der Instanz\r\n\t\t$instanceID = IPS_GetParent(CAM_LIGHT_SWITCH_ID);\r\n\t\t$ident      = IPS_GetObject(CAM_LIGHT_SWITCH_ID)[&#039;ObjectIdent&#039;];\r\n\t\tIPS_RequestAction($instanceID, $ident, GetValue($variableId));\r\n\r\n\t\t\/\/ Kurzes Warten auf das eigenliche Schalten des Lichtes\r\n\t\tIPS_Sleep(200);\r\n\t\t\r\n\t\t\/\/ Refresh des eigentlichen Kamera Lichtes\r\n\t\tIPS_RunScript(CAM_REFRESH_SCRIPT_ID);\r\n\t}\r\n\r\n\tfunction CreateVariable ($name, $type, $parentId, $position=0, $profile=&quot;&quot;, $action=null) {\r\n\t\t$variableId = @IPS_GetVariableIDByName($name, $parentId);\r\n\t\tif ($variableId === false) {\r\n \t\t\t$variableId = IPS_CreateVariable($type);\r\n\t\t\tIPS_SetParent($variableId, $parentId);\r\n\t\t\tIPS_SetName($variableId, $name);\r\n\t\t\tIPS_SetIdent($variableId, $name);\r\n\t\t\tIPS_SetPosition($variableId, $position);\r\n  \t\t\tIPS_SetVariableCustomProfile($variableId, $profile);\r\n \t\t\tIPS_SetVariableCustomAction($variableId, $action);\r\n\t\t}\r\n\t\treturn $variableId;\r\n\t}\r\n\r\n\tfunction CreateEvent ($name, $variableId, $scriptId) {\r\n\t\t$eventId = @IPS_GetEventIDByName($name, $scriptId);\r\n\t\tif ($eventId === false) {\r\n\t\t\t$eventId = IPS_CreateEvent(0);\r\n\t\t\tIPS_SetParent($eventId, $scriptId);\r\n\t\t\tIPS_SetName($eventId, $name);\r\n\t\t\tIPS_SetIdent($eventId, $name);\r\n\t\t\tIPS_SetEventTrigger($eventId, 1\/*ByChange*\/, $variableId);\r\n\t\t\tIPS_SetEventActive($eventId, true);\r\n  \t\t}\r\n\t\treturn $eventId;\r\n\t}\r\n\r\n\r\n?&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Die Einbindung der Kameras in IPSView ist in <a href=\"http:\/\/ipsview.brownson.at\/?p=561\">Teil 2 dieses Themas<\/a> zu finden<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Teil 1 dieses Themas besch\u00e4ftigt sich mit der Anbindung der  [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,6],"tags":[41,42],"class_list":["post-558","post","type-post","status-publish","format-standard","hentry","category-howto","category-skripte","tag-kamera","tag-stream"],"_links":{"self":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts\/558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=558"}],"version-history":[{"count":6,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts\/558\/revisions"}],"predecessor-version":[{"id":590,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts\/558\/revisions\/590"}],"wp:attachment":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}