Mersive Solstice
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.
A Solstice Pod is a room-control and occupancy endpoint, not a switchable video input. You commission it like any other device — add it under Devices and give it one zone — so it does not appear on the AV → AV Sources screen and you do not create an AV Source row for it.
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 Pod under System → Devices → Add Device and
choose Mersive Solstice (
mersive_solstice) as the driver. - Fill in
ipwith the Pod's LAN address andapi_keywith the OpenControl API key. Leaveportat the default of443. The Pod's HTTPS certificate is self-signed; GEM accepts it automatically, so there is no extra TLS setup. - Save. The device should come up Connected. If it stays disconnected, the
usual cause is a rejected API key: OpenControl answers a bad key with an
empty
{}body and HTTP 200 instead of a 401, so there is no authentication error to surface — regenerate the key in the Pod admin console and re-paste it. - Run get_status to confirm the Pod's display name, software version, and current connection count.
- Create one zone for the Pod and bind it to this device. Set the zone
address to a free-form identifier (the room name works well). Place the zone
under the AV subsystem — when you add a zone on a Mersive Solstice device
the editor pre-selects AV for you (the driver hints it); if you start
from Zones instead, pick AV yourself. The driver
does not create zones on its own, so nothing reports until you add one.
Once it is bound, the zone state toggles to
in_usewhenever at least one client is connected andidleotherwise.
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 screen key, when the Pod is exposing it. |
Only state is catalogued in GEM's attribute registry, so it autocompletes in
the Attribute editor and is the reliable name to reference in an attribute
trigger (for example, run a "lights up / shades down" macro when the Pod's
state becomes in_use). The Pod also writes connected_users,
display_name, software_version, and screen_key live onto the zone, but
those names are not in the catalogue — to use one in a trigger or a tile, type
it exactly as spelled here.
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 must be one of automatic, manual_change, or manual_no_change (capitalization does not matter — the driver lowercases it — but the token itself must match). |
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
connectedUserCountas the source of truth for occupancy. Some firmware variants return onlyconnectedUsersas an array; the driver handles both shapes but you may seeconnected_usersattribute updates pause if a future firmware reshapes the payload. set_display_nameposts 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 |
|---|---|
Device won't connect and get_status returns {} | OpenControl answered with an empty object because the API key is wrong (it returns HTTP 200, not a 401, on a bad key). Regenerate the key in the Pod admin console and re-paste it. |
connection refused on port 443 | OpenControl API not enabled in Settings → Security. |
set_screen_key_mode returns an error | The mode argument must be one of automatic, manual_change, or manual_no_change. Capitalization is normalized (the driver lowercases what you send), so the error means the token didn't match — a localized label or a shorthand like auto will be rejected. |
Zone state stays idle while a presentation is live | A firmware variant may not expose a connected-user count. Run get_status manually and inspect the response payload; note the field names you see so the count source can be widened. |
Related documentation
- Devices — add and configure the Solstice Pod. Open Devices
- Zones — create the one zone that carries the Pod's occupancy state (place it in the AV subsystem).
- Subsystems — the AV subsystem the zone belongs to.
- Commands — the command grid and Test runner for
disconnect_all,set_screen_key_mode, and the rest.