Table of Contents


This integrates the GPIO ports of a BeagleBone Black (BBB) SoC machine using the Adafruit_BBIO library with a distributed node environment based on WAMP.

For wiring things together, it sports a highlevel API based on components written in Python. We have bricks as the core building blocks and features on top of them.

This was made in 2014, today you might want to have a look at things like Node-RED, which might be able to achieve similar things but also sports a rich ecosystem of addons called Node-RED flows and a visual editor for connecting these components to each other.

ScratchX might offer the same infrastructure through ScratchX Wiki/Scratch Extensions, let’s check:

[…] make it possible to connect Scratch projects with external hardware (such as LEGO WeDo or PicoBoard) or sources of information on the web. They add a collection of command and reporter blocks that can be used to interact with a particular device or data source. When an extension is enabled, its blocks appear in the “More Blocks” palette.

Snap! is also supported by the Scratch 2 Offline Editor Hardware Extension for Arduino.

Also take a look at Xideco, a network-enabled software backplane in form of a cross-platform interconnect fabric between the popular Arduino, Raspberry and BeagleBone Black platforms. Read their Intro to Xideco.

See also

For an introduction to BBB GPIO programming using Python, have a look at the tutorial Using the Adafruit_BBIO Library.


  • BinaryInputPort: Monitor a GPIO input port, emit signals on state changes

  • BinaryOutputPort: Set or unset a GPIO output port

  • Blinker: Toggle GPIO output port between on and off

  • TimedBinarySemaphore: Building block for a virtual push-button

    • set a GPIO output port

    • hold it for a configurable holdtime

    • unset the GPIO output port

  • BinaryTopicSignal

    • Receive a signal from a bus network and forward to receiver actor/port.


On top of these bricks, features can be implemented.


Let’s implement a feature for detecting motion using a PIR sensor connected to a GPIO port and reacting on that. It should:

  • When PIR sensor was triggered through some activity:

    • Turn LED into slow blinking mode

    • Publish “activity(True)” message to bus network

  • After “holdtime”:

    • Turn LED off

    • Publish “activity(False)” message to bus network

The implementation of this feature is almost pseudo code based on composition of components:

# Define some aliases for bricks. Naming things.
PirMotionDetector = BinaryInputPort
SignalLight       = BinaryOutputPort

class ActivityMonitor(FeatureBase):

    # port allocation
    PORT_LED = 'P8_13'
    PORT_PIR_SENSOR = 'P8_19'

    def start(self, holdtime):

        # Define a slow blinking light (default interval 0.5s)
        self.blinking_light = Blinker(SignalLight(self.PORT_LED))

        # Define a PIR data source and connect it to the slow blinking light
        PirMotionDetector(self.PORT_PIR_SENSOR, signal=TimedBinarySemaphore(holdtime=holdtime, callback=self.on_event))

    def on_event(self, state, *args, **kwargs):

        # Turn led on or off based on output state of a component
        if state:

        # Publish activity to bus network forwarding the current state of the component
        self.publish('broadcast:node-activity', {'state': state})



This section is just a stub. Read the source, luke.

Embedded use

Setup node sandbox

apt-get install mplayer

python -m venv .venv
source .venv/bin/activate
pip install distribute==0.6.45
pip install Adafruit_BBIO

cd src/kotori.node
python setup.py develop
cd -

Master/node modes

master only:

kotori master --debug

node only:

kotori node --master=ws://offgrid:9000/ws --debug
kotori node --master=ws://beaglebone.local:9000/ws --debug
kotori node --master=ws://master.example.com:9000/ws --debug