Listening: 9000
Connecting…
No notifications
No feed messages
Device
Message Tracker

Click the device tab → Query to populate from device, or add manually below. Select a row to edit.

Name Scenes
SensorRange
No messages tracked yet.
Click the device tab → Query to load from device, or create one below.

Create / Edit Message

 
 

Clone / Rename Message

Direct Command

One-step: creates a message + scene, links them, and starts streaming immediately. If a message or scene with the same name already exists, it will be replaced.

Scene Tracker

Click Query to populate from device. Start/stop scenes directly from the table.

Status Name Messages
No scenes tracked yet.
Query the device or create a scene below.

Create / Edit Scene

 
 

Scene ↔ Message

Clone / Rename Scene

Scene setAll

Apply one config string to every message currently in a scene.

◎ 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

Saved Orientations

Oris saved on the device. Click "List Oris" to refresh from device.

Name Samples Mode Color Active Actions
No orientations tracked yet.
Register an ori below or query the device.

Register Ori

Create a named ori slot on the device immediately. Then use Record Ori below (or Button A on ab7 devices) to capture its orientation. Color is auto-assigned from a 12-color palette, or pick a custom one.

Record Ori

Start a recording session — move the device through all the orientations this ori should match, then click Stop. The device auto-detects whether to use axis-aware (pointing) or full-quaternion (zone) matching.

Quick-Save Orientation

Instantly save the device's current orientation as a single sample. Re-saving an existing name appends another sample to its cloud.

Ori Settings

Threshold sets the motion gate — device must be still (below this rad/s) before matching. Tolerance widens the angular match window. Strict disables fallback to the last-matched ori when none match.

Ori Color & Select

Set the LED color for an ori (used for on-device button editing on ab7 devices). Select makes this the active ori for the physical button workflow.

Ori Actions

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.

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.

Euler Tare

Zero the Euler angle output relative to the device's current orientation.

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.