How to Run Different PiPresents Shows on Different Days of the Week

A PiPresents pipresents.wordpress.com/ show (we're talking about a Raspberry Pi running Raspbian) can be set to end at a time of day, but it does not have a way to set a day of the week. I have created a workaround for this using the standard Linux cron scheduler and some bash scripts.

Let's take a look at the first script. I think the comments explain it well enough. I named mine pp.sh. Be sure to make the file executable after you create it.

#!/bin/bash

# the name of the profile should be passed to this script
profile=$1

# show a black/blank screen
qiv -fmisC -d 5 /home/pi/media/common/blank.png &
# stop any running PiPresents shows
kill $(ps aux | grep pipresents.py | awk '{ print $2 }')
sleep 3;
# start the new show with the given profile and in the home folder below
python /home/pi/pipresents/pipresents.py -fb -o /home/pi/media -p "${profile}"

Now add an entry in cron to start the show. Run cron from your normal user (pi) in a terminal with crontab -e. The entry below starts a profile named 'myshow' at 8:30 am every sunday.

30 08 * * 0 /home/pi/pp.sh myshow

That's really all there is to it.

However, I also have a script to turn the screen on and off as part of the schedule, which would have a cron entry like this to turn off at 1:00 PM.

30 08 * * 0 /home/pi/screen.sh on; /home/pi/pp.sh myshow
00 13 * * 0 /home/pi/screen.sh off

Screen.sh looks like this.

#!/bin/bash

export XAUTHORITY=/home/pi/.Xauthority
export DISPLAY=":0"
export XAUTHLOCALHOSTNAME=localhost

if [ "$1" == "on" ]; then

  # see if we're already on
  state=$(tvservice -s | grep -oE 'DMT|CEA')
  echo "${state}"
  if [[ $state = "DMT" || $state = "CEA" ]]; then
    exit 0
  fi

  # turn on
  tvservice -p; 
  sleep 1;
  fbset -depth 8
  fbset -depth 16
  xrefresh
  sleep 3;

  # see if we're really on
  state=$(tvservice -s | grep -oE 'DMT|CEA')
  echo "${state}"
  if [[ $state = "DMT" || $state = "CEA" ]]; then
    exit 0
  fi
  exit 1
fi

if [ "$1" == "off" ]; then

  # see if we're already off
  state=$(tvservice -s | grep -o  'off')
  if [[ ${state} == "off" ]]; then
    exit 0
  fi

  # turn off
  tvservice -o;
  sleep 5;

  # see if we're really off
  state=$(tvservice -s | grep -o  'off')
  if [[ ${state} == "off" ]]; then
    exit 0
  fi
  exit 1
fi

Another improvement might be to turn off the PiPresents show when turning off the screen and turn on the screen based on some input.