GEM driver for Mersive Solstice wireless-presentation endpoints — Solstice
Pod (Gen 3 / Gen 4) and Solstice Element — over the local OpenControl REST
API. The driver lets a GEM macro pull live room-occupancy data, kick a stale
session, rotate the screen key between meetings, and rename a Pod from a
room-control workflow.
The OpenControl API runs locally on the Pod; Solstice Cloud is not
required for this integration. Pods that are enrolled in Solstice Cloud can
still be controlled through the local API as long as their LAN address is
reachable from the GEM host.
Prerequisites
- Solstice firmware 5.x or later (older firmware used a SOAP API not covered
by this driver).
- Enable the OpenControl REST API in the Pod admin console:
Settings → Security → OpenControl API → Enable. Copy the generated API
key — it is shown once and regenerating it is the only way to recover it
if lost.
- The Pod must be reachable on TCP/443 from the GEM host.
Setup steps
- Add the device under Devices → Add and pick Mersive Solstice as
the driver.
- Fill in
ip with the Pod's LAN address and api_key with the OpenControl
API key. Leave port at the default of 443.
- Save and watch the server log for
mersive solstice connected. If you see
initial read empty — check api_key, the API key is wrong — OpenControl
returns 200 with an empty object instead of 401 when the bearer key is
rejected.
- Run get_status to confirm the Pod's display name and software version.
- Create one zone per Pod. The zone address is a free-form identifier (we
recommend the room name). The zone state will toggle between
in_use
when at least one client is connected and idle otherwise.
Attribute reference
Device
| Attribute | Required | Description |
|---|
ip | yes | LAN IP of the Solstice Pod. |
api_key | yes | OpenControl API key (secure). |
port | no | HTTPS port. Default 443. |
status_interval | no | Poll interval for /api/stats in ms. Default 15000. |
Zone
| Attribute | Description |
|---|
| address | Free-form identifier, usually the room name. |
| state | in_use while clients are connected; idle otherwise. |
| connected_users | Live count of connected clients. |
| display_name | Current Pod display name as shown on the welcome screen. |
| software_version | Solstice firmware version. |
| screen_key | Current 4-digit screen key (when visible). |
Commands
| Command | Description |
|---|
get_status | Read /api/stats — same payload the driver polls automatically. |
get_config | Read /api/config for the full configuration snapshot. |
get_connections | List currently connected clients (user name + endpoint). |
disconnect_all | Disconnect every connected client — useful as an "end meeting" trigger from a wall-station macro. |
regenerate_screen_key | Mint a new screen key. Useful at meeting end to invalidate the previous code. |
set_screen_key_mode | Set screen-key visibility. mode accepts automatic, manual_change, or manual_no_change. |
set_display_name | Update the Pod's display name. name is a non-empty string. |
reboot | Reboot the Pod. Disruptive — only call when the room is unoccupied. |
Known limitations
- OpenControl is read-mostly. There is no public API to start, stop, or
steer an individual share — only disconnect-all. Per-user disconnect is
intentionally not surfaced yet; add it as a follow-up if needed.
- The driver currently treats
connectedUserCount as the source of truth
for occupancy. Some firmware variants return only connectedUsers as an
array; the driver handles both shapes but you may see connected_users
attribute updates pause if a future firmware reshapes the payload.
set_display_name posts to /api/config/system/display-name; older
firmware may use a different path. If you see a 404, fall back to a
manual change in the Pod admin console and report the firmware version.
Troubleshooting
| Symptom | Likely cause |
|---|
initial read empty — check api_key | OpenControl returned 200 with {} because the bearer key is wrong. Regenerate the key in the Pod admin console. |
connection refused on port 443 | OpenControl API not enabled in Settings → Security. |
set_screen_key_mode returns an error | The mode argument must be exactly automatic, manual_change, or manual_no_change — case-sensitive. |
Zone state stays idle while a presentation is live | A firmware variant may not expose connectedUserCount. Run get_status manually and inspect the response payload; file an issue with the field names you see. |