Two bottles in two places. Each senses the weather where it stands and renders the other's conditions
as colour, brightness and mist. Nothing is ever displayed as a number — the design question is what a
system should withhold in order to stay in peripheral attention rather than demanding it.
HardwareESP32-S3 · BME280 · BH1750 · NeoPixel ring · nebuliser
TransportMQTT over TLS, symmetric publish/subscribe
SourcesLocal sensors plus a live weather API
RenderingColour, brightness, mist density
One firmware, two roles
Both jars run identical firmware. What differentiates them is two strings set through a web
configuration portal on first boot: its own device ID and its partner's. Every MQTT topic is derived
from those, so jar A publishes to telepathic_jar/JarA/data and subscribes to
telepathic_jar/JarB/data, and the pairing is symmetric by construction rather than by
configuration discipline. Adding a third jar would mean changing the topic scheme, not the code that
reads sensors.
The read-and-publish loop, from the project write-upOne jar's stack: environmental sensing, a controller, a light ring and a nebuliser.
Curating the mapping, not reporting the data
The system never shows a reading. Which colours the light is allowed to take, how bright it may get,
and what makes the nebuliser fire are all authored decisions that map temperature, humidity, pressure,
ambient light and live weather onto an atmosphere. Weather text from the API is matched to a base hue
before temperature adjusts it, so rain and cold rain are related but distinguishable.
The constraint that mattered was restraint: enough resolution to feel a change, not enough to invite
reading it as a measurement.
The finished pair, one lit from the internal ring.
Ambient systems have to make failure legible
The first firmware reconnected silently whenever the link dropped, which produced the worst possible
ambiguity for a calm-technology object: a jar sitting quietly could mean it is calm where they
are or the connection is gone. Those are opposite messages rendered identically. The
shipped version adds periodic reconnection with explicit status reporting, so an unreachable partner
looks different from a peaceful one. For a device whose whole point is being glanced at rather than
read, an unreadable failure state is not a minor bug.