All materials and notes for dowse workshops are collected here 11KB


Notes for Dowse workshops setup and materials


How to deploy Dowse on a Raspberry Pi

  • you need:

    • a Raspberry Pi (version 2 or 3)
    • a power supply with at least 2A power (the Raspberry Pi 3 needs 2.5A) and a Micro-USB connector
    • a MicroSD card with at least 4GB capacity, class 10
    • the Dowse image file from

      • For now a newer image is available in this workshop

        Wat to do

  • use your computer to clone the image onto the SD card (

  • diskutil list and unmount the right device (the card you write upon)

  • diskutil unmountDisk </dev/disk3>

  • from the folder with the images

    • xzcat /path/to/devuan_ascii_dowse_raspi2.img.xz | sudo dd of=</dev/disk3> bs=4M`


  • connect it to your access point/router via an Ethernet cable
    • optional: you can connect a monitor via HDMI and keyboard and mouse, but you'll have to do it before powering it up. This might be useful at the beginning because you can log in to it right away, get its IP address and change settings, etc.
  • connect it to power to boot it up
  • Dowse should now be running!

  • Log in to your home router/access point

  • disable DHCP (also for IPv6 if that is on, as apparently Windows 10 uses IPv6 for DNS)

  • The router will give you the Dowse box's IP address. With the default SD card image Dowse takes its IP via DHCP

  • Use that to SSH into your Dowse box, i.e. with ssh root@

  • set up a static IP address for your dowse box (edit /etc/network/interfaces). After all, you have disabled the router's DHCP, so if you ever reboot the Dowse box (your new DHCP server), it will want to know which IP it should have.

There are two users set up, root and dowse. The default password for root is toor, for the user dowse it is dowse. Log in as dowse to go straight to the interactive Dowse console.

How to say Dowse is running:

  • find out its IP address. Your router might tell you if you log in to its web interface, or try an app like

  • Let's assume it's Open a Terminal and type ping

  • or open in your browser. You should see the captive portal. Enter yourself as the administrator.

  • another way to check that the captive portal works: dig

How to say dowse is running on WIN machines

  • Open the startmenu and type as a command to run 'cmd' - it will open a commandprompt
  • run 'ping'
  • if it says 'xx bytes from … time=xx ms' a few times, it works!
  • Open '' in your browser


  • Dowse runs your DHCP. If it fails, try to disable the DHCP on your router
  • Check if there is a seperate DHCPv6 that might cause IPv6 resolving issues (Windows 10 uses IPv6 for DNS)


Gource allows to visualize the data using a colorful, dynamic and animated graph. It's processor-intensive so it should be run on a client machine.

How to use Gource on a windows machine

  • Windows does not come with SSH. It is possible to use an alternative SSH-client called 'Putty' (Download URL:
  • After installing, there is a ssh console client called plink.exe. It might not be in your 'PATH'. To run it from windows commandline, you need to specify the whole path. E.g. "c:\Program Files\Putty\plink.exe …"
  • When piping the output to gource, Windows does not show the interactive prompot for the password. But you can specify the password via the commandline switch -pw

<full_path_to_putty>\plink.exe -pw dowse -l dowse /usr/local/dowse/bin/dowse-to-gource | <full_path_to_gource>\gource.exe --log-format custom -


  • Instead of cmd/powershell, use a shell that knows SSH and such tools like ''
  • Untested, please document :-)

On Mac:

NB, if you dont have XCODE, is sufficient to have the minimal version of it. Open a terminal and type:

  • xcode-select --install - Then is time to install homebrew
  • install via homebrew First install brew if it isn't already, then just do brew install gource Once installed, start gource on your own laptop with a basic command like:

ssh -l dowse /usr/local/dowse/bin/dowse-to-gource | gource --log-format custom -

NB you will be asked the password. Default password is



you can also get dns queries listed directly in your shell i.e. with ssh -l dowse /usr/local/dowse/bin/dowse-to-gource

How to start OSC

ssh into the dowse box (See 'Putty' further down if you are on Windows)

then start:

/usr/local/dowse/bin/dowse-to-osc osc.udp://ip-of-machine-to-send-to:port/path

to make it start at every boot, put this line inside the file /etc/rc.local (edit as root)

Node Red

A graphical editor to edit node patches/flows. Such flows allow reacting to input (like Dowse MQTT data). Not required to use Dowse. You can write your own programms or create gadgets that recieve MQTT or OSC data and do things with it.

after installing node red you can follow a great tutorial :

(It can also be installed on the dowse box, right? Following the instructions here, will report back if it works:


Installation Linux

  • install node.js
  • in terminal sudo npm install -g --unsafe-perm node-red

Installation Mac

Installation Win

go to node.js website and install node.js

open node terminal type: sudo npm install -g --unsafe-perm node-red

Notes about making the workshop better (feel free to add)

  • Remember that to Setup dowse for WS takes always a bit...
  • Start a local etterpad for the workshop to begin with
  • point to a page already populated with documentation,
  • instruct on how to change the documentation
  • Bring white board markers !
  • default dowse for WORKSHOPS is partymode (everyone gets online immediately)
  • explain rapidly how the lan works in regard to DNS queries


Node MCU

Node-red to Arduino

saved for awareness [

    "id": "ef1636fd.7b444",
    "type": "redis-command",
    "z": "e245c75.b7b05b8",
    "server": "1eaea47.a3a8fdc",
    "command": "keys",
    "name": "redis_thing_list",
    "topic": "",
    "x": 534,
    "y": 214,
    "wires": [
    "id": "ff91d9fa.ca87b",
    "type": "function",
    "z": "e245c75.b7b05b8",
    "name": "things_state",
    "func": "global.set(\"count\", msg.payload.length);\n\nmsg.payload = global.get(\"count\");\n\nreturn msg;",
    "outputs": 1,
    "noerr": 0,
    "x": 774,
    "y": 83,
    "wires": [
    "id": "a26d10b.1e4a97",
    "type": "redis-command",
    "z": "e245c75.b7b05b8",
    "server": "1eaea47.a3a8fdc",
    "command": "keys",
    "name": "redis_thing_list",
    "topic": "",
    "x": 513,
    "y": 399,
    "wires": [
    "id": "38d0bf6d.74b7c8",
    "type": "inject",
    "z": "e245c75.b7b05b8",
    "name": "list_things",
    "topic": "",
    "payload": "[\"thing_*\"]",
    "payloadType": "json",
    "repeat": "",
    "crontab": "",
    "once": false,
    "x": 227,
    "y": 398,
    "wires": [
    "id": "3403d100.3bcc38",
    "type": "trigger",
    "z": "e245c75.b7b05b8",
    "op1": "",
    "op2": "[\"thing_*\"]",
    "op1type": "nul",
    "op2type": "json",
    "duration": "1",
    "extend": false,
    "units": "s",
    "reset": "",
    "name": "trigger_rescan",
    "x": 348,
    "y": 227,
    "wires": [
    "id": "cc300ec0.38ee8",
    "type": "function",
    "z": "e245c75.b7b05b8",
    "name": "comp_things",
    "func": "var old_cnt = global.get(\"count\");\nvar new_cnt = msg.payload.length;\n\nif (old_cnt > new_cnt) {\n    msg.payload = \"A thing went away.\";\n} else if ( old_cnt < new_cnt) {\n    msg.payload = \"A thing appeared!\";\n} else {\n    msg.payload = null;\n}\n\nreturn msg;",
    "outputs": 1,
    "noerr": 0,
    "x": 790,
    "y": 401,
    "wires": [
    "id": "87175c25.0255f8",
    "type": "debug",
    "z": "e245c75.b7b05b8",
    "name": "",
    "active": true,
    "console": "false",
    "complete": "false",
    "x": 1034,
    "y": 418,
    "wires": []
    "id": "1eaea47.a3a8fdc",
    "type": "redis-config",
    "z": "",
    "host": "localhost",
    "port": "6379",
    "dbase": "0",
    "pass": ""