Created by: csmith
Published Mar. 12, 2013
For this project at Caktus we created a simple voting poll that allows users to vote over SMS and displays the results as the votes come in. To reproduce this project, you'll need a Raspberry Pi and something to handle SMS messages. Our project uses a GSM modem, but the project could be configured to use Twilio or similar services. The project leverages three great Python projects: Django, RapidSMS, and Pygame.
The backend is a simple RapidSMS app that can be found here on Github: RapidSMS-RaspberryPi The backend handles the receiving, processing, and sending of SMS messages and provides the Django admin interface for creating and configuring polls. RapidSMS also provides a web interface for watching SMS messages come in or for faking the receipt of an SMS message.
The frontend is a Pygame project that can be seen here: RaspberryPoll. RaspberryPoll queries the database for the vote totals of the current poll and displays these in a bar chart. It is capable of cycling through multiple polls, though for our purposes we only enable a single poll at a time.
We ran both the backend and frontend on the same Raspberry Pi without any problems, but the two could be split over multiple Pi's on a network if desired.
Related categories: PyGame , Web
Step 1: Install Requirements
On a Raspberry Pi running the Raspbian distribution, navigate to a terminal or use SSH to install the requirements listed on the Rapidsms-RaspberryPi Github page. These requirements include Git, Python, Pip, Virtualenv, and Virtualenvwrapper. You should be able to install these following the steps below:
sudo apt-get install git-core python-dev python-setuptools sudo easy_install pip sudo pip install virtualenv virtualenvwrapper
Step 2: Clone RapidSMS-RaspberryPi
In a terminal, or over ssh run:
git clone email@example.com:caktus/rapidsms-raspberrypi.git
In a browser, navigate to the RapidSMS-RaspberryPi Github page and follow the directions under Getting Started. Those steps are summarized below for your convenience. You may also want to change the database name in raspberrypi-rapidsms/settings/base.py to point to a different location on your file system. The location isn't that important but you'll need to remember it for setting up the frontend project.
mkvirtualenv --distribute rapidsms_raspberrypi $VIRTUAL_ENV/bin/pip install -r $PWD/requirements/dev.txt cp rapidsms_raspberrypi/settings/local.example.py rapidsms_raspberrypi/settings/local.py echo "export DJANGO_SETTINGS_MODULE=rapidsms_raspberrypi.settings.local" >> $VIRTUAL_ENV/bin/postactivate echo "unset DJANGO_SETTINGS_MODULE" >> $VIRTUAL_ENV/bin/postdeactivate deactivate workon rapidsms_raspberrypi python manage.py syncdb python manage.py migrate python manage.py runserver
The final step should run the Django runserver successfully.
Step 3: Setup a RapidSMS backend
If you have a GSM modem:
First, we'll need to install kannel on the Pi with:
sudo apt-get install kannel
Now, you'll need to configure the modem to work with RapidSMS using the RapidSMS Kannel backend as described here: RapidSMS Kannel Backend Documentation.The default settings file contains a `INSTALLED_BACKENDS` declaration that you may need to configure for your setup.
Step 4: Clone RaspberryPoll
To setup the frontend of the project, start by cloning RaspberryPoll. You can accomplish this with:
git clone firstname.lastname@example.org:caktus/raspberrypoll.git
The raspberrypolldisplay.py file contains the code needed for the frontend. It takes a single argument for the location and filename of the sqlite database to use. The repository comes with a test.sqlite file for testing the frontend on its own before hooking it up to a backend. To run, simply use:
python raspberrypolldisplay test.sqlite
fakepoll.py is a program that runs separately and updates the data in a given sqlite database file in order to simulate changes to the data made by the backend. fakepoll also takes the location and filename of the sqlite database as an argument. While raspberrypolldisplay is running, run the following to see the database change with random data:
python fakepoll.py test.sqlite
At this point, we want to run the frontend with the same database that the backend uses. The backend project doesn't come with a default poll, so we'll need to set one up. To accomplish this, we need to setup a Poll in the RapidSMS-RaspberryPi backend. While running the rapidsms-raspberrypi project, navigate to the Pi in a web browser into the Django admin. You'll need to create a Poll that is marked active and give it two or more Options. Options should not have spaces in their names.
Now you're ready to run the frontend off of the same database. To do this, simply run raspberrypolldisplay with an argument for the SQLite database that the backend is configured to use in rapidsms-raspberrypi/settings/base.py. By default, this is '/var/tmp/rapidsms_raspberrypi' as in the following example:
python raspberrypolldisplay.py /var/tmp/rapidsms_raspberrypi
Feel free to experiment with different fonts or images to show in the corners. You'll probably want to keep Razzy though.