sukumo vat monitor
a fermenting indigo vat at bioclub tokyo, monitored by a raspberry pi. an experiment in multispecies attention: temperature, electrode voltages, ph, orp, and dissolved oxygen are logged continuously. the pi publishes the latest reading to a public google sheet every 30 minutes, and archives each day's full csv to drive.
// dashboard
// what's being measured
- temperature
- vat liquid temperature in °C, read continuously from a DS18B20 probe at mid-depth. lab studies hold sukumo fermentation at ~26–30°C (30 ± 1°C in Aino et al., 2010; 26°C in Lopes et al., 2022). the traditional recipe (below) calls for above 30°C during early fermentation.
- electrodes (surface / mid / bottom)
- voltage from carbon paper strips on the vat wall at three depths. shifts with the vat's chemistry. 4 at surface (N/S/E/W), 2 at mid (N/S), 2 at bottom (N/S). read continuously against a shared reference.
- pH
- acidity / alkalinity, manual reading. fermenting sukumo is strongly alkaline, typically pH 10.3–11 (Tu et al., 2021).
- ORP (oxidation-reduction potential)
- how chemically reducing the vat is, in millivolts. more negative = more reducing. manual reading.
- DO (dissolved oxygen)
- oxygen dissolved in the liquid, in mg/L. manual reading.
// the diagram
a top-down view of the vat. each electrode is a coloured dot. surface electrodes sit on the outer ring, middle on the next ring in, bottom on the innermost. N/S/E/W match the vat walls. around each dot, a speckled cloud grows or shrinks with the electrode's reading. larger readings produce larger clouds, mapped linearly from −0.5 V (smallest) to +0.5 V (largest); readings outside that range are clipped.
each pixel's density is the sum across all electrodes, weighted by reading:
w_k(p) = exp(−|p − e_k|² / 2σ_c²) + 0.6 · exp(−|p − e_k|² / 2σ_h²) where σ_c ≈ 0.13 · R and σ_h ≈ 0.40 · R D(p) = ∑_k L_k · w_k(p) (L_k = electrode k's level, 0–1)
the density is squared (so high readings produce more contrast), capped, and compared to a fixed dither pattern. a pixel is inked when it exceeds the threshold:
P(p) = min(0.72, D(p)²) ink at p if P(p) > τ(p) and P(p) > 0.05
the colour of each inked pixel is a distance-weighted average of nearby wire colours: ∑_k w_k · c_k / ∑_k w_k.
// orp target
the bar under the manual readings places the latest ORP between −700 and 0 mV. indigo dyes only in its reduced, water-soluble (leuco) form and reverts to insoluble blue once reoxidised (Roessler et al., 2002). in sukumo fermentation, reduction begins as ORP falls to about −500 mV, and the indigo-reducing bacteria operate below −600 mV (Lopes et al., 2022). the bar marks −600 mV as its reference. the pointer turns red above −550 mV.
// contribute
each interaction with the vat (manual reading, stir, feed, observation, creative session) gets one diary entry. anyone can submit anonymously.
before your first contribution: sign participant consent form →
taking a manual reading with the whitebox
-
join the
sukumo-netwifi.password is on a label on the router (ask in the lab if unsure).
-
open a terminal.
- macOS: spotlight →
terminal - windows: start →
powershell - linux: ctrl+alt+t
- macOS: spotlight →
-
verify you can reach the pi.
curl -s http://192.168.8.220:8080/api/latest
json output = you're connected. hang or "could not resolve host" = wrong network.
-
place probes in the vat.
rinse each with distilled water first.
-
read.
echo "waiting 60 seconds..."; sleep 60; curl -s http://192.168.8.220:8080/api/whitebox/read | python3 -m json.tool
returns ph, orp, do after a 60-second settle:
{ "do_mg_l": 1.19, "orp_mv": -601.0, "ph": 9.52 } -
submit via the diary form.
pick "manual reading" (or similar) and paste the three values.
-
rinse and re-store the probes.
- ph & orp: KCl-based storage solution. never dry out.
- do: kept dry, cap loose.
troubleshooting
- "could not resolve host" or hangs: not on
sukumo-net, or pi is offline. - value is null: probe not responding. check probe ↔ ezo connection.
- values look wrong (pH ~7, orp positive, do > 5 mg/L): probe needs calibration.
notes
- past entries can't be edited via the form. submit a new entry with corrected values; mention the correction in notes.
- the dashboard and the pi's local diary only refresh when the pi next syncs (it spends most of its time offline at the lab). the responses sheet itself is always live.
// recipe
from 藍建講習会テキスト (足利の藍染 藍絽座, Kazama Yukizō, Ashikaga, Tochigi)
// 30L vat
ingredients
- 3 kg fermented indigo leaves (sukumo)
- 3 kg wood ash (burn the wood, then leave the ash to sit with water for 1 day; prepare the day before)
- 1 kg shell ash (same amount as wood ash)
- 100 g wheat bran
- lye made from wood ash, up to 5L (about 500g ash)
day 1 (up to 5L)
- place 3 kg sukumo into the 30L jar.
- heat 5 L of lye (made from wood ash) to 80°C.
- pour the warm lye into the jar and stir vigorously with a wooden stick for 5 minutes.
- stir again in the evening. keep the mixture warm. temperature must stay above 30°C. if cold, use an electric blanket.
temperature control is critical at this stage.
day 2 (up to 14L)
- repeat the day 1 process in the morning.
- carefully add more ash, making sure no air gets into the liquid.
- stir again in the evening.
day 3 (add 3L, total ~14L)
- heat 4 L of lye to about 35°C.
- carefully add the warmed lye to the jar.
- stir morning and evening, avoiding introducing air.
day 4
- stir morning and evening.
- check for flower (bloom). if visible, proceed to day 5.
day 5 (add remaining lye, total ~18L, then to ~28L)
- repeat the day 3 process.
- a rainbow-coloured film should appear on the surface. if not, stir again.
day 6 (up to 22L)
- repeat the day 3 process.
- the rainbow-coloured film should still appear on the surface. if not visible, stir again.
day 7
- if the rainbow-coloured film is visible, add 100 g of bran and more ash to the pot.
- add enough ash to slightly cover the bran and cook over medium heat for about 30 minutes, stirring often to prevent burning.
- once the mixture cools to about 40°C, carefully add it to the indigo liquid, avoiding air.
- to adjust the pH to 11, gradually add more shell ash while stirring.
day 8
the indigo solution is now ready for use.
// care
- during dyeing, avoid letting too much air enter the solution. air weakens the microorganisms and prevents the dye from developing its colour.
- regularly check the pH. if too low, adjust by adding more shell ash.
- if colour still doesn't develop after adjusting pH: heat 500–1000 ml of lye and maltose in a saucepan until dissolved. allow to cool to ~40°C, then add to the indigo solution and stir.
- remove the bloom by hand before dyeing.
// build
using the vat data in your own work: sound, visuals, anything. two ways in: the public archive (csv, anywhere, any time), or the live OSC stream (lab-only, while the pi is powered up).
hear it now
a browser sonification turns the readings into a 3D chord. temperature, pH, ORP and DO each blend in a filter. click to mute, slide to shape, record to save. polls the pi's sheet every 3 minutes; on sukumo-net, the pi serves a faster realtime version.
working from the archive
for analysis, rendering past sessions, or making pieces from previous days.
-
open the drive folder.
each day has a subfolder with the day's csv plus any uploaded media. one row per minute; columns are timestamp, temperature, 8 electrode voltages, and the last manual ph / orp / do.
-
load the csv.
standard csv, utf-8. python:
pandas.read_csv(...). supercollider / max: any csv reader. the diary sheet (linked in contribute) gives context for what humans were doing alongside the readings. -
map values.
rough ranges to start from:
- temperature: 22–32 °C
- each electrode: 0.0–0.5 V
- pH: 9.5–11.5
- ORP: −500 to −300 mV
- DO: 0.0–2.0 mg/L
receiving live OSC (in the lab)
the pi sits behind a travel router (gl.inet "mango") in the lab. the router broadcasts a wifi network called sukumo-net, and the pi is reachable at 192.168.8.220 on that network. live OSC works whenever the pi is powered up. no internet required.
-
join the
sukumo-netwifi.on your laptop, join the wifi named
sukumo-net. password is on a label on the router (or ask in the lab). if the network name has changed, ask for the current one. -
verify you can reach the pi.
open
http://192.168.8.220:8080/api/latestin a browser. if you see JSON with current readings, you're on the right network. if it doesn't load, you're not onsukumo-net. go back to step 1. -
pick a tool.
OSC (Open Sound Control) is a UDP message format that almost every creative-coding environment can receive. starting points:
- pure data
- visual, flow-based. free at puredata.info.
- supercollider
- text-based, powerful for sound. free at supercollider.github.io.
- max/msp, touchdesigner
- commercial; both have free tiers. max is similar to pure data; touchdesigner is for visuals.
- python
- example script can be dropped into any project. uses
python-osc.
-
open the matching example.
- pure data → osc_receiver_puredata.pd
- supercollider → osc_receiver_supercollider.scd
- python → osc_receiver_python.py
each listens on UDP port
9000. messages arrive once per polling cycle (currently every 60 seconds). -
map values.
each example prints incoming values; replace the print with your sound / visual / parameter. ranges as above.
-
if it isn't working:
- on
sukumo-net? (step 1) - can you load
/api/latest? if not, fix the network before debugging OSC. - tool listening on UDP port
9000? - firewall blocking UDP? macOS: System Settings → Network → Firewall. Windows: Defender Firewall.
- on
OSC address scheme
/sukumo/temperature <float °C> /sukumo/electrode/sfc_n <float V> /sukumo/electrode/sfc_s <float V> /sukumo/electrode/sfc_e <float V> /sukumo/electrode/sfc_w <float V> /sukumo/electrode/mid_n <float V> /sukumo/electrode/mid_s <float V> /sukumo/electrode/btm_n <float V> /sukumo/electrode/btm_s <float V> /sukumo/ph <float> /sukumo/orp <float mV> /sukumo/do <float mg/L>
missing values send /sukumo/<key>/missing 1 instead of a number.