| 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
| Status | Name |
|---|---|
No orientations tracked yet — Query device or register one below. | |
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.
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.
| 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.
| ||
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.
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. |