Table Of Contents

Next topic

Installation

This Page

Gadgets - a physical computing framework

Gadgets provides a way to control physical devices with python on a Beaglebone or a Raspberry PI (Raspberry Pi only has gpio and spi switch functionality for now). It provides an easy way to create a system that:

  • Controls devices with the gpio, pwm, adc, and 1-wire interfaces
  • Has an easy to use User Interface
  • Can be distributed across many devices
  • Uses RCL (Robot Command Language)
  • Can run methods (a sequece of RCL commands)

Gadgets provides several classes that are useful for controlling various devices. They are:

  • Switch
  • Valve
  • Heater
  • Cooler
  • Motor

The simplest one is Switch. Here is an example of how to set up a gadgets system that uses Switch to control multiple devices.

The first thing to do is define the switches you are going to use with a dictionary

>>> from gadgets.pins.beaglebone import pins
>>> from gadgets import get_gadgets
>>> arguments = {
...     "locations": {
...         "living room": {
...             "light": {
...             "type": "switch",
...             "pin": pins["gpio"][8][3]
...             },
...         "back yard": {
...             "sprinklers": {
...             "type": "switch",
...             "pin": pins["gpio"][8][11],
...             },
...         },
...     },
... }
>>> gadgets = get_gadgets(arguments)
>>> gadgets.start()

The above definition assumes you have connected some switch (perhaps a transistor or a relay) to port 8, pin 3 on the Beaglebone, and perhaps a transistor connected to port 8, pin 11. The transistor would then be connected to the solenoid valve that turns on the sprinklers (you will probably not be able to connect the solenoid directly to your Beaglebone because it would draw too much current and probably uses 24V AC).

One way you can turn on the light that you defined above is to open another terminal and start a python prompt.

>>> from gadgets import Sockets
>>> s = Sockets()
>>> s.send("turn on living room light")

The light you have connected to the Beaglebone should now turn on.

>>> s.send("turn off living room light")

This, of course, turns the light off. These two commands are examples of RCL (Robot Command Language).

To turn on the sprinklers in the back yard for 15 minutes, you would send this command:

>>> s.send("turn on back yard sprinklers for 15 minutes")

You can also control the gadgets by using the built in curses based user-interface. See gadgets.ui for more details.

IO

Gadgets.io

If you don’t need to use the Robot Command Language and don’t need the rest of the functionality that gadgets provides but only want to turn a pin on and off, take a look at gadgets.io.

UI

Gadgets.ui

Gadgets comes with a built in user interface. Read about it here User Interface.

Robot Command Language (RCL)

All Devices in the gadgets system respond to Robot Command Language (RCL). A RCL command takes the form of a simple string. It consists of:

<action> <location> <device name> <command argument> <units>

So, for example:

turn on living room light
turn on living room light 30 minutes

Here are the commands for all the built in devices (with optional arguments shown enclosed in parentheses.

Switch:

turn on <location> <name> (for <time> <seconds|minutes|hours>)
turn off <location> <name>

Valve:

fill <location> <name> (<volume> <liters|gallons>)
stop filling <location> <name>

Heater:

heat <location> <name> (<temperature> <C|F>)
stop heating <location> <name>

Cooler:

cool <location> <name> (<temperature> <C|F>)
stop cooling <location> <name>

Motor:

turn on <location> <name> (<number of encoder edges|time> <ticks|(seconds|minutes|hours)>)
turn off <location> <name>

In these examples turn on and turn off are the actions, living room is the location, and light is the device. A gadgets system that contained this device would be created by:

>>> from gadgets.pins.beaglebone import pins
>>> from gadgets import get_gadgets
>>> arguments = {
...     "locations": {
...         "living room": {
...             "light": {
...             "type": "switch",
...             "pin": pins["gpio"][8][3]
...             }
...         }
...     }
... }
>>> gadgets = get_gadgets(arguments)
>>> gadgets.start()

Gadgets was created to control my automatic beer brewery. I wrote a seperate interface to gadgets that is built for brewing beer that is called brewi. Here is a RCL method that brewi generates based on a beer recipe that it is given:

heat hlt 176.2 F
wait for heat hlt
fill tun 5.0 gallons
heat tun 151 F
wait for fill tun
wait for user grains added
fill hlt
heat hlt 185 F
wait for 60 minutes
fill tun 6.0 gallons
wait for 10 minutes
wait for user ready to recirculate
fill boiler
wait for user recirculated
fill boiler 1
heat boiler 190 F
wait for fill boiler
fill tun 4.0 gallons
wait for fill tun
stop heating hlt
wait for 2 minutes
wait for user ready to recirculate
fill boiler
wait for user recirculated
fill boiler
heat boiler 204 F
wait for 90 minutes
stop heating boiler
wait for 10 minutes
cool boiler 80 F
wait for 10 minutes
fill carboy
wait for user carboy filled
stop filling carboy

The ‘wait for user’ commands cause the RCL script to pause until a message is recieved from a user. For example, the command:

wait for user ready to recirculate

Will cause the system to wait for this message:

ready to recirculate

Change Log

0.3.0, 7/18/2013 -
improved the ‘command mode’ of the ui improved the note taking dialog of the ui changed the greenhouse example to reflect my current greenhouse setup
0.2.3, 5/28/2013 -
added ‘–commad’ to the gadgets console script fixed a few bugs added an example for watering the grass
0.2.2, 4/24/2013 -
fixed a bug in the shift register switch
0.2.1, 4/24/2013 -
fixed the curses user interface
0.2.0, 4/23/2013 -
added support for raspberry pi gpio
0.1.1, 3/6/2013 -

added a momentary option for switch, so that it only turns on for a small amount of time

changed README.md to README.txt so it will show up on pypi

added gadgets.devices.Button. It monitors a gpio input pin and pushes a status update when it changes

0.1.0, 2/26/2013 -

changed the way thermometer works and how it is configured for get_gadgets

added XBee IO for Switch

0.0.2, 2/16/2013 -
added a shift register switch

0.0.1, 2/12/2013 - first version