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.

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 device under Devices → Add and pick 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.
  3. 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.
  4. Run get_status to confirm the Pod's display name and software version.
  5. 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

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 4-digit screen key (when visible).

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 accepts automatic, manual_change, or manual_no_change.
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
initial read empty — check api_keyOpenControl returned 200 with {} because the bearer key is wrong. Regenerate the key in the Pod admin console.
connection refused on port 443OpenControl API not enabled in Settings → Security.
set_screen_key_mode returns an errorThe mode argument must be exactly automatic, manual_change, or manual_no_change — case-sensitive.
Zone state stays idle while a presentation is liveA firmware variant may not expose connectedUserCount. Run get_status manually and inspect the response payload; file an issue with the field names you see.