Isläggningskamera

20140219-085823För att kunna hålla koll på isläggningen i skärgården satte jag upp en iskamera på landstället på Sältingsholmen. Jag köpte en enkel nätverkskamera (D-Link DCS-930L) kopplade in en tvillingsim i ett USB modem (Huawei 3G) som sattes i en trådlös router (Dovado Tiny). Routern och kameran är inkopplade på 220v men kommunicerar trådlöst på routerna nätverk.

d-link-dcs-930lhuawei-3g-modemdovado-tiny-3g-4g-router

Man kan använda en app till sin smartphone för att se kameran live (mydlink).

Fördelen med den här kameran är att den bara sänder data över nätverket när bilder överförs,  vilket gör att det fungerar bra på ett vanligt mobilabonnemang med tanke på datamängden.

Jag har också konfigurerat kameran att ftp:a en bild varje morgon kl 9 och lägga upp den bilden på en egen sida som ett galleri: http://snabelslash.com/bo/saltingsholmen/

Det är två filer, dels webcam-worker.php som anropas av ett cron job kl 09.01 varje morgon, sedan index.php som visar bilderna.

Källkod webcam-worker.php

<?php
 /**
 
 S Ä L T I N G S H O L M E N C A M F E E D S L I D E S H O W
 
 W O R K F L O W
 1. Get latest image
 2. Move image to archive
 
 */

 error_reporting(E_ALL);
 require_once('lib.php'); 

 $drive_feed_root = "/saltingsholmen/";
 $archivefolder = "archive";
 global $delim;
 $delim = strstr(PHP_OS, "WIN") ? "\\" : "/";

 // 1. Get latest image
 $files = retrieveTree($drive_feed_root);
 usort($files, "cmp");
 foreach ($files as $file) {
 if($file['ext']=="jpg" && $file['sizenum']!=0 && $file['sizenum']>=30000){
 // 2. Move image to archive
 $newfilename = date("Ymd-His", $file['time']).".jpg";
 rename($drive_feed_root.$file['name'],$drive_feed_root.$archivefolder.$delim.$newfilename);
 $status="moved: $newfilename";
 break;
 }else{
 $status="nothing to do";
 } 
 }
 echo $status;
?>

Källkod index.php

 <?php

 error_reporting(E_ALL);
 require_once('lib.php'); 

 /**
 
 S Ä L T I N G S H O L M E N C A M F E E D S L I D E S H O W
 
 W O R K F L O W
 1. Iterate throught archive
 2. Extract date and time from each image
 3. Render html content
 
 */

 $drive_feed_root = "/saltingsholmen/";
 $archivefolder = "archive";
 global $delim;
 $delim = strstr(PHP_OS, "WIN") ? "\\" : "/";

 ?><!DOCTYPE html>
<html>
<head>
 <title>Sältingsholmen Webcam</title>
 <link href="css/ninja-slider.css" rel="stylesheet" type="text/css" />
 <script src="js/ninja-slider.js" type="text/javascript"></script>
 <style>
 body {font: normal 0.8em Arial;margin:0;}
 a {color:#1155CC;}
 ul li {padding: 10px 0;}
 .caption{
 position:absolute;
 width:100%;
 height:36px;
 top:auto;
 bottom:0px;
 color: #fff;
 background-color: #000;
 }
 </style>
</head>
<body>
 <div> 
 <div id='ninja-slider'>
 <ul>
 <?
 // 1. Iterate throught archive
 $archivefiles = retrieveTree($drive_feed_root.$archivefolder.$delim);
 usort($archivefiles, "cmpfilename");
 foreach ($archivefiles as $afile) {
 // 2. Extract date and time from each image
 // 3. Render html content
 echo "<li><div data-image='$archivefolder$delim".$afile['name']."'><div class='caption'>".date("F d Y", strtotime(substr($afile['name'],0,8)))."</div></div></li>\n"; 
 }
 ?>
 </ul>
 </div>
</div>
</body>
</html>

och till sist, lib.php

 <?
 /**
 *
 */
 function cmp($a, $b){
 return strcmp($b["time"], $a["time"]);
 }


 /**
 *
 */
 function cmpfilename($a, $b){
 return strcmp($b["name"], $a["name"]);
 }
 
 /**
 *
 */
 function size_hum_read($size){
 $i=0;
 $iec = array("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB");
 while (($size/1024)>1) {
 $size=$size/1024;
 $i++;
 }
 return substr($size,0,strpos($size,'.')+2)." ".$iec[$i];
 } 

 /**
 *
 */
 function retrieveTree($path) {
 global $delim;
 $curpath;
 $drive_feed_old;
 $files;
 
 $curpath = $path;
 $drive_feed_old = 0;

 
 if ($dir = @opendir($path)){
 while (($element = @readdir($dir)) !== false) {
 if (is_dir($path.$delim.$element) && $element{0}!="." && $element{0}!="_") {
 $temp_array[] = $element;
 } elseif ($element{0}!="." && $element{0}!="_") {
 $additem=false;
 if($drive_feed_old=="0"){
 $additem=true;
 }else{
 if((time()-filectime($curpath.$element))<=($drive_feed_old*24*60*60)){
 $additem=true;
 }
 }
 if($additem){ 
 $tmpfile = str_replace($path,"",$curpath.$element); 
 $tmpfullfile = str_replace("//","/",$path.$tmpfile);
 $tmpUArr = posix_getpwuid(fileowner($curpath.$element));
 $tmpsizenum = filesize($tmpfullfile);
 $tmpsize = size_hum_read($tmpsizenum);
 $tmpname = $tmpfile; 
 $tmptime = filectime($tmpfullfile);
 $tmpuser = $tmpUArr['name'];
 $tmpguid = md5("DRIVEFEED-SALT-01".$tmpfullfile);
 $tmpext = substr($tmpname,strpos($tmpname,'.')+1);
 
 $files[] = array("size"=> $tmpsize, "sizenum"=> $tmpsizenum, "name"=> $tmpname, "time"=> $tmptime, "user"=> $tmpuser, "guid"=> $tmpguid, "ext"=> $tmpext,); 
 $array[] = $element;
 
 } 
 }
 }
 /** NON RECURSIVE, NO SUBFOLDERS
 if (isset($temp_array)) {
 for ($i = 0; $i < sizeof($temp_array); $i++) {
 $element = $temp_array[$i];
 $curpath = $path."/".$element."/";
 $array[$element] = retrieveTree($path.$delim.$element);
 } 
 }
 */
 closedir($dir);
 }
 return (isset($files) ? $files : false);
 } 

?>

Leave a Reply

Your email address will not be published.