Status: proposal. Package names and API shape are illustrative until the protocol reference is confirmed. Licence: MIT.
TypeScript
import { discover } from "@edc-acoustics/sdk"; // PROPOSAL — names illustrative
const devices = await discover({ timeoutMs: 2000 }); // UDP / mDNS discovery <mechanism TBD>
const sq90 = devices.find(d => d.model === "SQ-90")!;
await sq90.beams[1].set({ panDeg: -12, tiltDeg: -8, hWidthDeg: 40, vWidthDeg: 25, levelDb: -3 });
await sq90.inputs[1].set({ gainDb: 0, mute: false });
await sq90.apply(); // mirrors the app's Push/Apply
await sq90.presets.recall("sunday-service"); // project- or array-level preset
sq90.on("status", s => console.log(s.temperatureC, s.faults)); // telemetry stream
Python
import edc_acoustics as edc # PROPOSAL — pip install edc-acoustics
devices = edc.discover(timeout=2.0)
sq90 = next(d for d in devices if d.model == "SQ-90")
sq90.beams[1].set(pan_deg=-12, tilt_deg=-8, h_width_deg=40, v_width_deg=25, level_db=-3)
sq90.apply()
sq90.presets.recall("sunday-service")
for status in sq90.status_stream():
print(status.temperature_c, status.faults)
CLI
edc discover · edc preset recall <id> · edc beam set <device> <n> --pan -12 --tilt -8 · edc status --watch · edc osc-bridge --listen <port>
Design rules
Typed models generated from /developers/openapi.yaml; semantic versioning; a --simulator flag that targets the Docker simulator; no telemetry sent anywhere but the LAN; README that opens with the install command and a working example.