Skip to main content

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.

note

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

  1. Add the Pod under System → Devices → Add Device and choose Mersive Solstice (mersive_solstice) as the driver.
  2. Fill in ip with the Pod's LAN address and api_key with the OpenControl API key. Leave port at the default of 443. The Pod's HTTPS certificate is self-signed; GEM accepts it automatically, so there is no extra TLS setup.
  3. 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.
  4. Run get_status to confirm the Pod's display name, software version, and current connection count.
  5. 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_use whenever at least one client is connected and idle otherwise.

Attribute reference

Device

AttributeRequiredDescription
ipyesLAN IP of the Solstice Pod.
api_keyyesOpenControl API key (secure).
portnoHTTPS port. Default 443.
status_intervalnoPoll interval for /api/stats in ms. Default 15000.

Zone

AttributeDescription
addressFree-form identifier, usually the room name.
statein_use while clients are connected; idle otherwise.
connected_usersLive count of connected clients.
display_nameCurrent Pod display name as shown on the welcome screen.
software_versionSolstice firmware version.
screen_keyCurrent 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

CommandDescription
get_statusRead /api/stats — same payload the driver polls automatically.
get_configRead /api/config for the full configuration snapshot.
get_connectionsList currently connected clients (user name + endpoint).
disconnect_allDisconnect every connected client — useful as an "end meeting" trigger from a wall-station macro.
regenerate_screen_keyMint a new screen key. Useful at meeting end to invalidate the previous code.
set_screen_key_modeSet 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_nameUpdate the Pod's display name. name is a non-empty string.
rebootReboot 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

SymptomLikely 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 443OpenControl API not enabled in Settings → Security.
set_screen_key_mode returns an errorThe 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 liveA 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.
  • 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.