# SDKs — TypeScript and Python (proposal)

> Open-source client libraries so a developer can discover, aim and monitor EDC loudspeakers from ten lines of code, with typed models generated from the OpenAPI file so docs and code cannot drift.
>
> Status: draft-spec. Canonical: https://www.edcacoustics.com/developers/sdks/

> **Status: proposal.** Package names and API shape are illustrative until the protocol reference is confirmed. Licence: MIT.

## TypeScript

```ts
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

```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.
