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.
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.
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.
| Name | Actions |
|---|---|
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.
| Name | Saved | Actions |
|---|---|---|
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.
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.
Python Console
Python API Reference
| Function | Description |
|---|---|
| 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 | |
device | High-level handle for the active device. Automatically uses the device's host, port, and name. |
device.name / .host / .port | Active 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 | |
state | Persistent 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. |