~ Order Pizza with USB Pizza Button» By Joren on Wednesday 11 November 2009
Recently I bought a big shiny red USB-button. It is big, red and shiny. Initially I planned to use it to deploy new versions of websites to a server but I found a much better use: ordering pizza. Graphically the use case translates to something akin to:
If you would like to enhance your life quality leveraging the power of a USB pizza-button: you can! This is what you need:
- A PC running Linux. This tutorial is specifically geared towards Debian-based distos. YMMV.
- A big, shiny red USB button. Just google “USB panic button” if you want one.
- A location where you can order pizzas via a website. I live in Ghent, Belgium and use just-eat.be. Other websites can be supported by modifying a Ruby script.
Technically we need a driver to check when the button was pushed, a way to communicate the fact that the button was pushed and lastly we need to be able to react to the request.
The driver: on the internets I found a driver for the button. Another modification was done to make the driver process a daemon.
The communication: The original Python script executed another script on the local pc. A more flexible approach is possible using sockets. With sockets it is possible to notify any computer on a network.
if PanicButton().pressed(): # create a TCP socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # connect to server on the port s.connect((SERVER, SERVER_TCP_PORT)) # send the order (margherita at restaurant mario) s.send("mario: [margherita_big]\n")
The reaction: a ruby TCP server waits for message from the driver. When it does it automates a HTTP session on a website. It executes a series of HTTP-GET’s and POST’s. It uses the mechanize library.
login_url = "http://www.just-eat.be/pages/member/login.aspx" a = WWW::Mechanize.new a.get(login_url) do |login_page| #post login_form login_form = login_page.forms.first login_form.txtUser = "username" login_form.txtPass = "password" a.submit(login_form, login_form.buttons) end
Some libraries are needed. For python you need the usb library, the python deamons lib needs to be installed seperatly. Setuptools are needed to install the deamons package.
sudo apt-get install python-usb python-setuptools
Ruby needs rubygems to install the needed mechanize and daemons library. Mechanize needs the
libxslt-dev package. You also need the
build-essential package to build mechanize.
To automatically start the daemons on boot you can use the crontab
@reboot directive of the root user. E.g.: