Bogen Nyquist
Bogen Nyquist is a REST-controlled paging, mass-notification, and audio-distribution platform used in K-12 schools, hospitals, warehouses, and corporate campuses. This driver targets the Nyquist appliance families (NQ-GA10PV, NQ-E7000, NQ-S1000) exposing the /api/v1/* REST endpoints, letting GEM send pages, all-calls, chime tests, and read live zone status from macros and UI controls.
The Nyquist server itself owns the audio, the message store, and the endpoints (IP speakers, amplifiers, station intercoms). GEM triggers pages against it — it does not replace it.
Prerequisites
- A Nyquist appliance reachable from the GEM controller (open TCP 443 for HTTPS, or 80 for legacy HTTP).
- Firmware new enough to expose
/api/v1— most 3.x and later builds. Older 2.x builds shipped a different API and are not supported. - An admin account with the REST API role enabled. Nyquist ships with the API disabled for read-write access, so this is a manual step in the Nyquist Web UI.
- Zones and stations already provisioned in Nyquist. This driver does not create zones — it dispatches against zones you have already defined.
- Pre-recorded messages loaded into the Nyquist message store, each with a stable numeric
message_idyou can pass into GEM commands.
Setup steps
- Enable REST. Sign into the Nyquist Web UI as a super-admin. Under Admin → Users, create a dedicated integration user (e.g.
gem-integration), assign it a strong password, and grant it the REST API role. Save. - Create the GEM device. In the GEM admin console under Devices, add a new device with driver Bogen Nyquist and fill in:
- Server IP or Hostname — the same host you use in the admin URL.
- API Username / API Password — the credentials from step 1.
- Leave HTTPS Port at 443 unless the server exposes a non-standard port.
- Set Protocol to
httponly if this is a legacy install running plain HTTP on port 80.
- Confirm connectivity. Save and reload the device row — the driver hits
GET /api/v1/system/versionon connect. On success the device shows connected and populatesfirmware_version/product_name/hostnameattributes. - Enumerate zones. Run the
get_zonescommand from Script Console or the device page. Nyquist returns the list of paging zones with theirzone_idvalues. Note the numeric IDs — those are thezone.addressvalues GEM uses. - Create a GEM zone per Nyquist zone. For each Nyquist zone you want to control, create a GEM zone under the appropriate subsystem (typically an "Audio / Paging" subsystem you have already provisioned) and set
zone.address = <numeric zone_id>. - (Optional) Preset a message. On any GEM zone, set the
default_message_idattribute to the Nyquist message-store ID you want a barepage_zone(nomessage_idargument) to play in that zone. This is convenient for one-shot buttons that always trigger the same announcement.
Attribute reference
Device attributes
| Attribute | Required | Default | Purpose |
|---|---|---|---|
ip | ✓ | — | Nyquist server IP or hostname. |
username | ✓ | — | Nyquist admin account with the REST API role enabled. |
password | ✓ | — | Password for the API user. Stored encrypted. |
port | 443 | HTTPS (or HTTP) port. | |
protocol | https | Set http for legacy servers on port 80. | |
api_base | /api/v1 | Override only if the server exposes the API at a non-default path. | |
status_interval | 15000 | Milliseconds between active-page polls. |
Zone attributes
| Attribute | Required | Purpose |
|---|---|---|
address | ✓ | Numeric Nyquist zone ID from get_zones. |
default_message_id | Nyquist message-store ID to use when a page_zone command omits message_id. |
Commands
| Command | Args | What it does |
|---|---|---|
page_zone | address, message_id, priority | Post a page request to a single zone. Priority defaults to 5; values >9 typically require a Nyquist emergency license. |
page_all | message_id, priority | All-call across every zone. |
stop_page | address (optional) | Cancel the active page in a zone (or every cached page if no address is given). |
test_zone | address | Play the built-in chime test in a zone. |
get_zones | — | Enumerate paging zones. Use to populate GEM zone.address values. |
get_stations | — | Enumerate IP endpoints (speakers, amps). |
get_status | — | Read server heartbeat + active-page count. |
get_messages | — | List pre-recorded messages available for paging. |
raw_command | path, method, body | Escape-hatch pass-through to any /api/v1/* endpoint — useful for endpoints this driver does not model directly (schedules, bells, CAP alerts). |
Zone address format
zone.address is the numeric zone_id reported by Nyquist. Enter it as a plain integer string (e.g. 3). The driver accepts both Number and String forms and normalizes to Number when posting to Nyquist.
What we don't yet support
- Bell schedules — Nyquist manages its own scheduler; use
raw_commandagainst/bell-schedulesif you need to trigger one from a macro. - Emergency / CAP alerts — the driver passes a priority arg through but does not translate CAP category codes. Use
raw_commandagainst/emergency-notificationsfor structured CAP payloads. - Multi-message playlists — this driver plays one message per
page_zone. - Live-mic paging — the Nyquist Web UI supports live-mic from a station; this driver does not open an RTP session.
- Station-level LED / mute / volume overrides — station endpoints exist under
/stations/{id}but the schemas vary between Nyquist server revs; useraw_commanduntil we can verify against a specific hardware set.
Troubleshooting
- 401 Unauthorized on connect. The API user does not have the REST API role, or the password is wrong. Reset in the Nyquist Web UI under Admin → Users.
- 403 Forbidden on
page_zone. The API user has the REST API role but the paging-scope permission is off. Grant "Paging" permission on the account in Nyquist. - 404 on
test_zone. Server firmware exposes the chime test under a different path — tryraw_commandwithpath=/zones/{id}/test(older builds) or/zones/{id}/actions/test(3.x+). get_zonesreturns an empty list. No paging zones are defined on the server. Provision at least one in the Nyquist Web UI before mapping addresses in GEM.- HTTPS handshake failures. Some Nyquist appliances still ship a self-signed cert; the driver accepts these by default. If you have a genuine cert-chain problem check the appliance clock — an off-clock server drops HTTPS handshakes silently.
- Pages stop reporting active state. The driver polls
/page-requests?state=activeonstatus_interval. If the server is under heavy load, back that off (e.g.30000) so polling does not starve real paging traffic.
References
- Nyquist REST API notes:
https://nyquist.bogen.com/support/— vendor-hosted developer portal. - Bogen Nyquist product line:
https://www.bogen.com/nyquist/