Category Archives: Misc

RPi Web Control

I have made progress and based on an instructables guide (see my previous article) I completed the design of my Web RPi control panel.
See below screenshots.
RPi_Web_Control_1

RPi_Web_Control_2

And here is the code for those who want:

GPIOServer.sh:

# Script created by Laurent Mahe from Daniel Curzon's original script (http://www.instructables.com/member/drcurzon)
# Initial version created December 2012

###################################
#####  EDIT THESE BEFORE USE  #####
###################################
mysqlusername="****"
mysqlpassword="****"
mysqlhostname="192.168.0.24"

#######################################################################
# setup:
#	Program the GPIO correctly and initialise the different parameters
#######################################################################

Setup ()
{
	printf "\033c"
	echo "Setup in progress..."
	Door_Lock=8
	MyLED=0
	MyLED_Status=0
	AlarmStatus=0
	MyLight=3
	MyPIR=4
	MyPIR2=5
	MyBuzzer=0

	#Invoke GPIO
	#echo "0" > /sys/class/gpio/export
	#echo "17" > /sys/class/gpio/export
	#echo "18" > /sys/class/gpio/export
	#echo "22" > /sys/class/gpio/export
	#echo "23" > /sys/class/gpio/export

	echo "in" > /sys/class/gpio/gpio0/direction
	echo "out" > /sys/class/gpio/gpio17/direction
	gpio -g mode 18 in
	echo "in" > /sys/class/gpio/gpio22/direction
	echo "in" > /sys/class/gpio/gpio23/direction
	echo "in" > /sys/class/gpio/gpio24/direction

	curl http://192.168.0.24:8080/1/detection/pause > /dev/null 2>&1
	curl http://192.168.0.24:8080/2/detection/start > /dev/null 2>&1
    $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber=91";)
    $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber=92";)
	if [ `gpio read $Door_Lock` = 1 ]; then
	  echo "Lock Status = [1] Unlocked" 
	else
	  echo "Lock Status = [0] Locked"
	  gpio write $MyLED 1
      $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='0'";)
      $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='17'";)
	  echo -e `date +%F_%T` "Activating motion detection...\n"
	  curl http://192.168.0.24:8080/1/detection/start > /dev/null 2>&1
      $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber=91";)
      $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber=92";)
	  waitDoor_Unlock
	fi
	Update_MySQL
}

#######################################################################
# waitDoor_Lock:
#	Wait for the door to be locked. Because we are using pin 17 (which
#	has a pull up resistor) we wait for the signal to go low indicating
# 	the door has been locked, then wait 3 min before activating motion.
#######################################################################

waitDoor_Lock ()
{
  echo -n "Waiting for door to be locked... "
  while [ `gpio read $Door_Lock` = 1 ]; do
    Update_MySQL
  done
  echo -e "\n"`date +%F_%T` "Countdown 3 min..."
  gpio write $MyLED 1
  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='0'";)
  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='17'";)
  sleep 180
  echo -e `date +%F_%T` "Activating motion detection...\n"
  curl http://192.168.0.24:8080/1/detection/start > /dev/null 2>&1
  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber=91";)
  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber=92";)
}

#######################################################################
# waitDoor_Unlock:
#	Wait for the door to be unlocked. Because we are using pin 17 (which
#	has a pull up resistor) we wait for the signal to go high indicating
# 	the door has been unlocked.
#######################################################################

waitDoor_Unlock ()
{
  echo -n "Waiting for door to be unlocked... "
  while [ `gpio read $Door_Lock` = 0 ]; do
    gpio write $MyLED $MyLED_Status
    if [ $MyLED_Status = 0 ]; then
      MyLED_Status=1
    else
      MyLED_Status=0
    fi
    Update_MySQL
  done
  echo -e "\n"`date +%F_%T` "Pausing motion detection...\n"
  curl http://192.168.0.24:8080/1/detection/pause > /dev/null 2>&1
  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber=91";)
  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber=92";)
  gpio write $MyLED 0
}

#######################################################################
# SetBuzzer:
#	Plays buzzer
#	Use: SetBuzzer x y where x is Freq and y is length
#######################################################################

SetBuzzer ()
{
  local note="$1" time="$2"
  if test "$note" -eq 0 ; then
    gpio -g mode 18 in
  else
    local period="$(perl -e"printf'%.0f',600000/440/2**(($note-69)/12)")"
	gpio -g mode 18 pwm
    gpio pwmr "$((period))"
    gpio -g pwm 18 "$((period/2))"
    gpio pwm-ms
  fi
  sleep "$time"
}

#######################################################################
# Update_MySQL:
#	Checks PIR + Photo-Resistor:
#	if no movement after 23:00 and light is on -> Alarm
#	if door is unlocked and no light after 23:00 -> Alarm
#	Finally update MySQL table for Web Control Panel
#######################################################################

Update_MySQL ()
{
	  #checks time of day. If past 23:00, sets alarm if (no light AND door unlocked) OR (light AND no movememnt)
	  MyTime=`date +%H`
#	  if (( 1 )); then
	  if (( (${MyTime:1:1} > 2 && ${MyTime:0:1} == 2) || (${MyTime:1:1} < 4 && ${MyTime:0:1} == 0))); then
		if [ `gpio read $MyPIR` = 0 ] && [ `gpio read $MyPIR2` = 0 ] && [ `gpio read $MyLight` = 1 ]; then
		  echo -e `date +%F_%T` "\n"" Late, lights on and no movement --> [ALARM]"
		  AlarmStatus=1
		  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='18'";)
		  SetBuzzer 90 0.5
		else
		  AlarmStatus=0
		  gpio -g mode 18 in
		  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber='18'";)
		fi
		if [ `gpio read $Door_Lock` = 1 ] && [ `gpio read $MyLight` = 0 ]; then
		  echo -e `date +%F_%T` "\n"" Late, lights off and Door not locked --> [ALARM]"
		  AlarmStatus=1
		  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='18'";)
		  SetBuzzer 90 0.5
		else
		  AlarmStatus=0
		  gpio -g mode 18 in
		  $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber='18'";)
		fi
	  fi
	  if ((AlarmStatus == 1)); then
			AlarmStatus=0
			gpio -g mode 18 in
			$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber='18'";)
	  fi

	#Get Door Lock Status
	if ((`cat /sys/class/gpio/gpio0/value` == 0)); then
		#set Door status in SQL to 1 (locked)
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='0'";)
	else
		#set Door status in SQL to 0 (unlocked)
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber='0'";)
	fi

	#Get Photo Resistor Status
	if ((`cat /sys/class/gpio/gpio22/value` == 1)); then
		#set status in SQL to 1
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='22'";)
	else
		#set status in SQL to 0
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber='22'";)
	fi

	#Get PIR1 Status
	if ((`cat /sys/class/gpio/gpio23/value` == 1)); then
		#set status in SQL to 1
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='23'";)
	else
		#set status in SQL to 0
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber='23'";)
	fi 

	#Get PIR2 Status
	if ((`cat /sys/class/gpio/gpio24/value` == 1)); then
		#set status in SQL to 1
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='24'";)
	else
		#set status in SQL to 0
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber='24'";)
	fi 

	#Get Door LED
	if ((`cat /sys/class/gpio/gpio17/value` == 0)); then
		#set Door status in SQL to 1 (locked)
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber='17'";)
	else
		#set Door status in SQL to 0 (unlocked)
		$(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber='17'";)
	fi

	#Set Buzzer
	if [ $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "SELECT pinStatus FROM pinStatus WHERE pinNumber='18'";) == "1" ]; then
		if (($MyBuzzer == 0)); then
			SetBuzzer 90 0.5
			MyBuzzer=1
		fi
	else
		gpio -g mode 18 in
		MyBuzzer=0
	fi

	CAM1=`curl -s http://192.168.0.24:8080/1/detection/status`
	MyCAM1=${CAM1:137:6}
	if [ $MyCAM1 == "ACTIVE" ]; then
		#update SQL as active
	    $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber=91";)
	else
		#either in pause or not available
	    $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber=91";)
	fi

	CAM2=`curl -s http://192.168.0.24:8080/2/detection/status`
	MyCAM2=${CAM2:137:6}
	if [ $MyCAM2 == "ACTIVE" ]; then
		#update SQL as active
	    $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber=92";)
	else
		#either in pause or not available
	    $(mysql -B --host=$mysqlhostname --disable-column-names --user=$mysqlusername --password=$mysqlpassword gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber=92";)
	fi
}

#Start Loop
while :
do
  Setup
  waitDoor_Lock
  waitDoor_Unlock
done

 

control.php:

<HTML>
<HEAD>
<title>RPi Control Panel</title>
<link rel="stylesheet" type="text/css" href="StyleSheet.css" />
<HEAD>
<STYLE type="text/css">
	BODY
	{
	background-attachment: fixed;
	background-image:  url(RPi_Bkgrd.jpg);
	background-repeat: no-repeat;
	background-position: center center;
	}
</STYLE>
<script src="jquery-1.8.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready (function () {
	var updater = setTimeout (function () {
	$("div#myDiv").load("index.php","action=refresh");
	}, 500);
});
</script>
</HEAD>
<BODY>

<?php
session_start();
//////////////////////////////
// EDIT THESE TWO VARIABLES //
//////////////////////////////
$MySQLUsername = "****";
$MySQLPassword = "****";

/////////////////////////////////
// DO NOT EDIT BELOW THIS LINE //
/////////////////////////////////
$MySQLHost = "127.0.0.1";
$MySQLDB = "gpio";

/* gets the data from a URL */
function get_data($url) {
  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

If (($MySQLUsername == "USERNAME HERE") || ($MySQLPassword == "PASSWORD HERE")){
	print 'ERROR - Please set up the script first';
	exit();
}

$dbConnection = mysql_connect($MySQLHost, $MySQLUsername, $MySQLPassword);
mysql_select_db($MySQLDB, $dbConnection);

$tbl = '';
$tbl .= "<table name='GPIO' border='1' cellpadding='5'>";
$tbl .= "<tr><th>GPIO #</th><th>GPIO Description</th><th>Status</th></tr>";

//Door Lock
$strSQL1 = mysql_query ("SELECT pinNumber, pinStatus FROM pinStatus WHERE pinNumber=0");
$strSQL2 = mysql_query ("SELECT pinNumber, pinDescription FROM pinDescription WHERE pinNumber=0");
$pinRow = mysql_fetch_assoc($strSQL1);
$descRow = mysql_fetch_assoc($strSQL2);
$pinNumber = $pinRow['pinNumber'];
$pinStatus = $pinRow['pinStatus'];
$pinDescription = $descRow['pinDescription'];
If ($pinStatus == "0"){
	$image = "Lock-Off.png";
} else {
	$image = "Lock-On.png";
}
$tbl .= "<tr>";
$tbl .= "<td align='center'>" . $pinNumber . "</td><td>" . $pinDescription . "</td><td><img src=" . $image . " width='50' border='0'></td>";
$tbl .= "</tr>";

//Door LED
$strSQL1 = mysql_query ("SELECT pinNumber, pinStatus FROM pinStatus WHERE pinNumber=17");
$strSQL2 = mysql_query ("SELECT pinNumber, pinDescription FROM pinDescription WHERE pinNumber=17");
$pinRow = mysql_fetch_assoc($strSQL1);
$descRow = mysql_fetch_assoc($strSQL2);
$pinNumber = $pinRow['pinNumber'];
$pinStatus = $pinRow['pinStatus'];
$pinDescription = $descRow['pinDescription'];
If ($pinStatus == "0"){
	$image = "LED-Off.png";
} else {
	$image = "LED-On.png";
}
$tbl .= "<tr>";
$tbl .= "<td align='center'>" . $pinNumber . "</td><td>" . $pinDescription . "</td><td><img src=" . $image . " width='50' border='0'></td>";
$tbl .= "</tr>";

//Buzzer
$strSQL1 = mysql_query ("SELECT pinNumber, pinStatus FROM pinStatus WHERE pinNumber=18");
$strSQL2 = mysql_query ("SELECT pinNumber, pinDescription FROM pinDescription WHERE pinNumber=18");
$pinRow = mysql_fetch_assoc($strSQL1);
$descRow = mysql_fetch_assoc($strSQL2);
$pinNumber = $pinRow['pinNumber'];
$pinStatus = $pinRow['pinStatus'];
$pinDescription = $descRow['pinDescription'];
If ($pinStatus == "0"){
	$action = "Buzzer-on";
	$image = "Buzzer-Off.png";
} else {
	$action = "Buzzer-off";
	$image = "Buzzer-On.png";
}
$tbl .= "<tr>";
$tbl .= "<td align='center'>" . $pinNumber . "</td><td>" . $pinDescription . "</td><td><a href='index.php?action=" . $action . "'><img src=" . $image . " width='50' border='0'></a></td>";
$tbl .= "</tr>";

//Photo Resistor
$strSQL1 = mysql_query ("SELECT pinNumber, pinStatus FROM pinStatus WHERE pinNumber=22");
$strSQL2 = mysql_query ("SELECT pinNumber, pinDescription FROM pinDescription WHERE pinNumber=22");
$pinRow = mysql_fetch_assoc($strSQL1);
$descRow = mysql_fetch_assoc($strSQL2);
$pinNumber = $pinRow['pinNumber'];
$pinStatus = $pinRow['pinStatus'];
$pinDescription = $descRow['pinDescription'];
If ($pinStatus == "0"){
	$image = "Photo-Resistor-Off.png";
} else {
	$image = "Photo-Resistor-On.png";
}
$tbl .= "<tr>";
$tbl .= "<td align='center'>" . $pinNumber . "</td><td>" . $pinDescription . "</td><td><img src=" . $image . " width='50' border='0'></td>";
$tbl .= "</tr>";

//PIR1
$strSQL1 = mysql_query ("SELECT pinNumber, pinStatus FROM pinStatus WHERE pinNumber=23");
$strSQL2 = mysql_query ("SELECT pinNumber, pinDescription FROM pinDescription WHERE pinNumber=23");
$pinRow = mysql_fetch_assoc($strSQL1);
$descRow = mysql_fetch_assoc($strSQL2);
$pinNumber = $pinRow['pinNumber'];
$pinStatus = $pinRow['pinStatus'];
$pinDescription = $descRow['pinDescription'];
If ($pinStatus == "0"){
	$image = "PIR-Off.png";
} else {
	$image = "PIR-On.png";
}
$tbl .= "<tr>";
$tbl .= "<td align='center'>" . $pinNumber . "</td><td>" . $pinDescription . "</td><td><img src=" . $image . " width='50' border='0'></td>";
$tbl .= "</tr>";

//PIR1
$strSQL1 = mysql_query ("SELECT pinNumber, pinStatus FROM pinStatus WHERE pinNumber=24");
$strSQL2 = mysql_query ("SELECT pinNumber, pinDescription FROM pinDescription WHERE pinNumber=24");
$pinRow = mysql_fetch_assoc($strSQL1);
$descRow = mysql_fetch_assoc($strSQL2);
$pinNumber = $pinRow['pinNumber'];
$pinStatus = $pinRow['pinStatus'];
$pinDescription = $descRow['pinDescription'];
If ($pinStatus == "0"){
	$image = "PIR-Off.png";
} else {
	$image = "PIR-On.png";
}
$tbl .= "<tr>";
$tbl .= "<td align='center'>" . $pinNumber . "</td><td>" . $pinDescription . "</td><td><img src=" . $image . " width='50' border='0'></td>";
$tbl .= "</tr>";

//Garden Cam
$strSQL1 = mysql_query ("SELECT pinNumber, pinStatus FROM pinStatus WHERE pinNumber=91");
$strSQL2 = mysql_query ("SELECT pinNumber, pinDescription FROM pinDescription WHERE pinNumber=91");
$pinRow = mysql_fetch_assoc($strSQL1);
$descRow = mysql_fetch_assoc($strSQL2);
$pinNumber = $pinRow['pinNumber'];
$pinStatus = $pinRow['pinStatus'];
$pinDescription = $descRow['pinDescription'];
If ($pinStatus == "0"){
	$action = "Back-on";
	$image = "CCTV-Off.png";
} else {
	$action = "Back-off";
	$image = "CCTV-On.png";
}
$tbl .= "<tr>";
$tbl .= "<td align='center'>" . $pinNumber . "</td><td>" . $pinDescription . "</td><td><a href='index.php?action=" . $action . "'><img src=" . $image . " width='50' border='0'></a></td>";
$tbl .= "</tr>";

//Front Cam
$strSQL1 = mysql_query ("SELECT pinNumber, pinStatus FROM pinStatus WHERE pinNumber=92");
$strSQL2 = mysql_query ("SELECT pinNumber, pinDescription FROM pinDescription WHERE pinNumber=92");
$pinRow = mysql_fetch_assoc($strSQL1);
$descRow = mysql_fetch_assoc($strSQL2);
$pinNumber = $pinRow['pinNumber'];
$pinStatus = $pinRow['pinStatus'];
$pinDescription = $descRow['pinDescription'];
If ($pinStatus == "0"){
	$action = "Front-on";
	$image = "CCTV-Off.png";
} else {
	$action = "Front-off";
	$image = "CCTV-On.png";
}
$tbl .= "<tr>";
$tbl .= "<td align='center'>" . $pinNumber . "</td><td>" . $pinDescription . "</td><td><a href='index.php?action=" . $action . "'><img src=" . $image . " width='50' border='0'></a></td>";
$tbl .= "</tr>";

$tbl .= "</table>";

If (isset($_POST['action'])){
	If ($_POST['action'] == "setPassword"){
		$password1 = $_POST['password1'];
		$password2 = $_POST['password2'];
		If ($password1 != $password2){
			header('Location: index.php');
		}
		$password = mysql_real_escape_string($_POST['password1']);
		If (strlen($password) > 28){
			mysql_close();
			header('location: index.php');
		}
		$resetQuery = "SELECT username, salt FROM users WHERE username = 'admin';";
		$resetResult = mysql_query($resetQuery);
		If (mysql_num_rows($resetResult) < 1){
			mysql_close();
			header('location: index.php');
		}
		$resetData = mysql_fetch_array($resetResult, MYSQL_ASSOC);
		$resetHash = hash('sha256', $salt . hash('sha256', $password));
		$hash = hash('sha256', $password);
		function createSalt(){
			$string = md5(uniqid(rand(), true));
			return substr($string, 0, 8);
		}
		$salt = createSalt();
		$hash = hash('sha256', $salt . $hash);
		mysql_query("UPDATE users SET salt='$salt' WHERE username='admin'");
		mysql_query("UPDATE users SET password='$hash' WHERE username='admin'");
		mysql_close();
		header('location: index.php');
	}
}
If ((isset($_POST['username'])) && (isset($_POST['password']))){
	$username = mysql_real_escape_string($_POST['username']);
	$password = mysql_real_escape_string($_POST['password']);
	$loginQuery = "SELECT UserID, password, salt FROM users WHERE username = '$username';";
	$loginResult = mysql_query($loginQuery);
	If (mysql_num_rows($loginResult) < 1){
		mysql_close();
		header('location: index.php?error=incorrectLogin');
	}
	$loginData = mysql_fetch_array($loginResult, MYSQL_ASSOC);
	$loginHash = hash('sha256', $loginData['salt'] . hash('sha256', $password));
	If ($loginHash != $loginData['password']){
		mysql_close();
		header('location: index.php?error=incorrectLogin');
	} else {
		session_regenerate_id();
		$_SESSION['username'] = "admin";
		$_SESSION['userID'] = "1";
		mysql_close();
		header('location: index.php');
	}
}
If ((!isset($_SESSION['username'])) || (!isset($_SESSION['userID']))){
	print '
		<div id="main">
		<table border="0" width="90%">
		<tr><td valign="middle"><img src="RPi_logo.png"></td><td valign="middle"><center><font color="#CC0066" size="7" face="Georgia, serif">RPi Control Panel</font></center></td></tr>
		</table>
		<font face="verdana">
		<center>
	';
	print '
	<table border="0" align="center">
	<form name="login" action="index.php" method="post">
	<tr>
	<td>Username: </td><td><input type="text" name="username"></td>
	</tr>
	<tr>
	<td>Password: </td><td><input type="password" name="password"></td>
	</tr>
	<tr>
	<td colspan="2" align="center"><input type="submit" value="Log In"></td>
	</tr>
	</form>
	</table>
	</div>
	</body>
	</html>
	';
	die();
}
If (isset($_GET['action'])){
	If ($_GET['action'] == "logout"){
		$_SESSION = array();
		session_destroy();
		header('Location: index.php');
	} else If ($_GET['action'] == "setPassword"){
		print '
		<div id="main">
			<table border="0" width="90%">
			<tr><td valign="middle"><img src="RPi_logo.png"></td><td valign="middle"><center><font color="#CC0066" size="7" face="Georgia, serif">RPi Control Panel</font></center></td></tr>
			</table>
			<font face="verdana">
			<center>
		';
		print '
		<form name="changePassword" action="index.php" method="post">
		<input type="hidden" name="action" value="setPassword">
		<p>Enter New Password: <input type="password" name="password1">  Confirm: <input type="password" name="password2"><input type="submit" value="submit"></p>
		</form>
		';
	} else {
		$action = $_GET['action'];
		$pin = mysql_real_escape_string($_GET['pin']);
		if ($action == "turnOn"){
			$setting = "1";
			mysql_query("UPDATE pinStatus SET pinStatus='$setting' WHERE pinNumber='$pin';");
			mysql_close();
			header('Location: index.php');
		} else If ($action == "turnOff"){
			$setting = "0";
			mysql_query("UPDATE pinStatus SET pinStatus='$setting' WHERE pinNumber='$pin';");
			mysql_close();
			header('Location: index.php');
		} else If ($action == "Back-on"){
			exec ("curl http://192.168.0.24:8080/1/detection/start > /dev/null 2>&1", &$output);
			header('Location: index.php');
		} else If ($action == "Back-off"){
			exec ("curl http://192.168.0.24:8080/1/detection/pause > /dev/null 2>&1", &$output);
			header('Location: index.php');
		} else If ($action == "Front-on"){
			exec ("curl http://192.168.0.24:8080/2/detection/start > /dev/null 2>&1", &$output);
			header('Location: index.php');
		} else If ($action == "Front-off"){
			exec ("curl http://192.168.0.24:8080/2/detection/pause > /dev/null 2>&1", &$output);
			header('Location: index.php');
		} else If ($action == "Buzzer-on"){
			exec ('$(mysql -B --host=' . $MySQLHost  . ' --disable-column-names --user=' . $MySQLUsername . ' --password=' . $MySQLPassword . ' gpio -e "UPDATE pinStatus SET pinStatus=1 WHERE pinNumber=18";)', &$output);
			header('Location: index.php');
		} else If ($action == "Buzzer-off"){
			exec ('$(mysql -B --host=' . $MySQLHost  . ' --disable-column-names --user=' . $MySQLUsername . ' --password=' . $MySQLPassword . ' gpio -e "UPDATE pinStatus SET pinStatus=0 WHERE pinNumber=18";)', &$output);
			header('Location: index.php');
		} else IF ($action =="edit"){
			$pin = mysql_real_escape_string($_GET['pin']);
			$query = mysql_query("SELECT pinDescription FROM pinDescription WHERE pinNumber='$pin';");
			$descRow = mysql_fetch_assoc($query);
			$description = $descRow['pinDescription'];
			print '
				<div id="main">
				<table border="0" width="90%">
				<tr><td valign="middle"><img src="RPi_logo.png"></td><td valign="middle"><center><font color="#CC0066" size="7" face="Georgia, serif">RPi Control Panel</font></center></td></tr>
				</table>
				<font face="verdana">
				<center>
			';
			print '
			<table border="0">
			<form name="edit" action="index.php" method="get">
			<input type="hidden" name="action" value="update">
			<input type="hidden" name="pin" value="' . $pin . '">
			<tr>
			<td><p>Description: </p></td><td><input type="text" name="description" value="' . $description . '"></td><td><input type="submit" value="Confirm"></td>
			</tr>
			</form>
			</table>
			</div>
			</body></html>
			';
			mysql_close();
		} else IF ($action =="update"){
			$pin = mysql_real_escape_string($_GET['pin']);
			$description = mysql_real_escape_string($_GET['description']);
			mysql_query("UPDATE pinDescription SET pinDescription='$description' WHERE pinNumber='$pin';");
			header('Location: index.php');
		}
		else IF ($action =="refresh")
		{
			echo $tbl;
			die ();
		}
		else {
			header('Location: index.php');
		}

	}
} else {
	mysql_close();
	print '
		<div id="main">
		<table border="0" width="90%">
		<tr><td valign="middle"><img src="RPi_logo.png"></td><td valign="middle"><center><font color="#CC0066" size="7" face="Georgia, serif">RPi Control Panel</font></center></td></tr>
		</table>
		<font face="verdana">
		<center>
		<br><br><div id="myDiv">
	';
	echo $tbl;	
	print '</div><br><br>
	<p><a href="index.php?action=setPassword">Change Password</a></p>
	<a href="index.php?action=logout">Log out</a>
	</center>
	</font></div>
	</body></html>
	';
}	
?>

 




Theme Update

Having updated WordPress to version 3.5, I also updated the theme to “Twenty Twelve”.

It looks slightly slicker but I had to reduce the header pictures a bit to accommodate…




Control your Raspberry Pi via a Web Interface

Until now, I had to VNC on my Raspi, then open a terminal window, then run a script.
If I wanted to make adjustments, I’d have to stop the script, edit it, then run it again.

Thanks to drcurzon via www.instructables.com, I started to work on a Web Control Panel for my Raspi to contol LED’s, Light and Movement Alerts.

Have a look at the great instructions to reproduce: www.instructables.com/id/Web-Control-of-Raspberry-Pi-GPIO/

Web Control of Raspberry Pi GPIO




New header pictures

I thought I’d customise my WordPress based page and replace the built in header pictures with my own.

I now have shots from some of my trips showing up. Enjoy







Home Automation Project

I’m using my Raspberry Pi more and more for home automation.

I have forgotten a few times to switch off the light downstairs while going to bed. And I usually don’t realise it’s been on until the next morning.

Similarly and more gravely I forgot a few times to lock the door.

Now I’m sure I’m not the only one to reach the bed, get comfortable and then ask myself “Did I lock the door?” only to have to go downstairs and double check.

This is where my Raspberry Pi and few components comes in handy: I have a PIR  for motion detection, a photo-resistor and a piezo buzzer connected to my Pi via a breadboard. Then it’s “simple”: check if it’s late in the day, check whether the light is on and if so, was there movement in the last 5 min? Yes? Then sound the alarm !

Similarly check if it’s late in the day, check whether the light is off and if so, is the door locked? No? Then sound the alarm !

I’ll create a dedicated page with some pics and code soon.




Welcome!

Quote-Open
Welcome to my site. I purchased a Raspberry Pi in the middle of 2012 when it came out. At first, I really bought it as a gadget, not really knowing what I’d do with it, but it really grew on me so I decided to keep a blog of my experiences with it.

The ultimate goal was for the Raspberry Pi to be the brain of an home automation setup. A lot has changed since then, with many components added or replaced, but the beloved Raspberry Pi still holds a central role and importance in my ever changing setup.

I’ll try and update this blog with any major update or addition, with as many details and references as possible, but feel free to poke me if you need any more details on a specific iteration.

I hope you enjoy reading this as much as I enjoyed writing it.
Happy reading!