Listening: 9000
Connecting…
No notifications
No feed messages
Device
Name Scenes
SensorRange
No messages tracked yet — Query device or create one below.

Create / Edit Message

 
 

Clone / Rename Message

Status Name Messages
No scenes tracked yet — Query device or create one below.

Create / Edit Scene

 
 

Scene Functions

(comma-sep)
Status Name
No orientations tracked yet — Query device or register one below.
◎ How Orientations (Oris) Work

An ori is a saved device orientation. Register a name, record its orientation by moving the device through the poses you want it to recognize, then stop. The device continuously calculates which saved ori it's currently closest to.

Hold Button A on the device to record; release to save. Short tap = instant single sample.

Use the Gate system on messages (enable in Advanced Tools) to conditionally send based on ori state or any sensor value.

OnlyMessage sends only when the gate condition is active
NotMessage sends only when the gate condition is NOT active
ToggleSends the high value when active, low value when not
RisingScene gate — fires once when sensor crosses above the trigger threshold (non-ori only). "Trigger" = threshold, "Delta" = minimum delta.
FallingScene gate — fires once when sensor crosses below the trigger threshold (non-ori only). "Trigger" = threshold, "Delta" = minimum delta.

Global Ori Actions

Strict Matching

Query

Save Current State as Show

Snapshots all current messages, scenes, and oris on the device into a named slot (up to 4 on device, unlimited in Gooey library).

On Device

Shows stored in device NVS (max 16). Loading a show replaces all current messages, scenes, and oris on the device.

NameActions
No shows saved on device.

Local Library

Shows saved as JSON files in gooey/data/shows/. Human-readable and editable. Load to device pushes all data then saves a device NVS snapshot.

NameSavedActions
No shows in library.

IMU Calibration

Advanced Tools

Type just the last octet (e.g. 80) in any IP field — it will expand to the full address on blur.

Raw OSC Send

Send any arbitrary OSC message. Arguments are space-separated by default.

Bridge

Forward OSC messages from one port to another host/port.

Mobile Remote

Scan from your phone or tablet to open the annieData remote on your local network.

Remote QR code

Python Editor

Write Python to process sensor data and send OSC messages. Use sensor("accelX") to read values and osc_send(host, port, addr, val) to send.

1

Python Console

Python API Reference

FunctionDescription
Sensors
device.sensor("accelX")Get the latest sensor value from this specific device. Correct when multiple devices are connected. Returns 0.0 if unavailable.
device.sensors()Get all sensor values for this device as a dict: {"accelX": 0.5, ...}
sensor("accelX")Unscoped shorthand — fine for single-device setups. With multiple devices, last write wins.
sensors()Unscoped all-sensor dict — merged across all devices, same caveat.
osc_data("/full/address")Get raw args list for a full OSC address path.
OSC
osc_send(host, port, addr, ...)Send a raw OSC message. Example: osc_send("192.168.1.50", 7000, "/fader/1", 0.75)
on_osc(pattern, fn)Call fn(address, args) when an incoming OSC message matches pattern. Supports OSC wildcards: * ? [abc] {a,b}. Dispatched between loop iterations. Register once (outside the loop body).
Device proxy
deviceHigh-level handle for the active device. Automatically uses the device's host, port, and name.
device.name / .host / .portActive device identity.
device.blackout() / .restore()Stop or restart all scenes immediately.
device.save() / .load()Persist or reload NVS config on the device.
device.on_change()Toggle duplicate-suppression on the device.
device.list_msgs() / .list_scenes()Ask the device to report its objects (replies update gooey's tables).
Message proxy — device.msg("name")
.enable() / .disable()Enable or mute the message. Name may be an OSC wildcard pattern.
.assign(value="accelX", ip="…", port=9000, adr="/x", low=0, high=1)Create or update message config. Keys match firmware field names.
.delete() / .info()Delete the message, or ask the device to reply with its config.
Scene proxy — device.scene("name")
.start() / .stop()Start or stop streaming. Name may be an OSC wildcard pattern.
.enable() / .disable()Enable or disable the scene.
.period(ms)Set send interval in milliseconds.
.add_msg("name") / .remove_msg("name")Add or remove a message from the scene.
.solo("name") / .unsolo()Solo one message; restore all.
.assign(ip="…", port=9000, adr="/base", period=50)Create or update scene config.
Registry snapshots
messages()Snapshot of gooey's tracked message configs: {"accelX": {"adr": "/x", ...}, ...}. Only includes messages gooey has seen.
scenes()Snapshot of gooey's tracked scene configs: {"myScene": {"period": 50, ...}, ...}.
State & time
statePersistent dict — survives between loop iterations.
elapsed()Seconds since script started.
dt()Seconds since last iteration.
Math & utilities
clamp(val, lo, hi)Clamp a value to a range.
remap(val, in_lo, in_hi, out_lo, out_hi)Linearly remap a value from one range to another.
math.*Full math module: sqrt, sin, cos, pi, etc.
random.*Full random module: random.random(), random.uniform(a, b), random.choice(seq), etc.
deque([…], maxlen=N)collections.deque — sliding window buffer. Useful for running averages.
print(...)Output to the console below.