Devialet Phantom Plugin

Control Devialet Phantom speakers via IP Control API

Devialet Phantom Plugin

The Devialet plugin enables TMRemote to control Devialet Phantom speakers, Expert Pro amplifiers, and Dialog hubs via the Devialet IP Control API.

Supported Devices

Features

Setup

1. Enable IP Control on Your Devialet

IP Control must be enabled in the Devialet app:

  1. Open the Devialet app on your phone
  2. Connect to your speaker
  3. Go to Settings > IP Control
  4. Enable IP Control

2. Add Device in TMRemote

  1. Open TMRemote and go to the Devialet plugin settings
  2. Click Discover to find devices on your network, or
  3. Enter the IP address manually and click Add
Tip: Use a static IP or DHCP reservation for your Devialet speakers to ensure consistent connectivity.

API Namespaces

The Devialet API uses different namespaces depending on your setup:

Namespace Use Case
systems Stereo pairs and multi-room groups (recommended)
devices Single speakers
groups Multi-room configurations
Note: The plugin defaults to the systems namespace which works for both stereo pairs and single speakers in most cases.

API Endpoints

The plugin communicates with the Devialet IP Control server running on port 80:

Base URL: http://{device-ip}/ipcontrol/v1/{namespace}/current/

Volume Control

Endpoint Method Description
sources/current/soundControl/volume GET Get current volume (0-100)
sources/current/soundControl/volume POST Set volume: {"volume": 50}
sources/current/soundControl/volumeUp POST Increase volume by 1
sources/current/soundControl/volumeDown POST Decrease volume by 1

Source Control

Endpoint Method Description
sources GET List available sources
sources/{sourceId}/playback/play POST Switch to source

Playback Control

Endpoint Method Description
sources/current/playback/play POST Resume playback
sources/current/playback/pause POST Pause playback
sources/current/playback/mute POST Mute audio
sources/current/playback/unmute POST Unmute audio
sources/current/playback/next POST Next track
sources/current/playback/previous POST Previous track

TMRemote REST API

The plugin exposes Devialet control through TMRemote's REST API. All endpoints are prefixed with /api/devialet/.

Device Endpoints

Endpoint Method Description
/api/devialet/devices GET List all connected Devialet devices
/api/devialet/devices/{id}/status GET Get playback status, volume, source, and metadata

Volume Control

Endpoint Method Body
/api/devialet/devices/{id}/volume GET Returns {"volume": 50}
/api/devialet/devices/{id}/volume POST {"volume": 50} (0-100)
/api/devialet/devices/{id}/mute POST {"muted": true} or empty for toggle

Source and Playback

Endpoint Method Body
/api/devialet/devices/{id}/source POST {"sourceId": "optical"}
/api/devialet/devices/{id}/playback POST {"action": "play|pause|next|previous"}

Power and Night Mode

Endpoint Method Body
/api/devialet/devices/{id}/power POST {"action": "off|restart"}
/api/devialet/devices/{id}/nightmode GET Returns {"nightMode": true, "available": true}
/api/devialet/devices/{id}/nightmode POST {"enabled": true}
/api/devialet/devices/{id}/bluetooth POST {"action": "advertise"} — make device discoverable for pairing

Events API

The plugin tracks state changes and exposes them via the events API. Events are stored in a ring buffer (last 100 events) and can be polled by external clients.

Endpoint Method Description
/api/devialet/events GET Get recent events from all devices
/api/devialet/devices/{id}/events GET Get events for a specific device

Query Parameters

Parameter Description Example
since Return events after this timestamp (ISO 8601) ?since=2026-01-18T12:00:00
limit Maximum number of events to return (default: 100) ?limit=10
type Filter by event type (partial match) ?type=Volume

Example Response

{
  "events": [
    {
      "type": "DevialetVolumeChanged",
      "deviceId": "devialet-192-168-1-100",
      "deviceName": "Living Room Phantom",
      "timestamp": "2026-01-18T14:30:00.000Z",
      "data": { "volume": 45, "previousVolume": 40 }
    },
    {
      "type": "DevialetSourceChanged",
      "deviceId": "devialet-192-168-1-100",
      "deviceName": "Living Room Phantom",
      "timestamp": "2026-01-18T14:31:00.000Z",
      "data": { "sourceId": "optical", "sourceType": "optical", "sourceName": "Optical", "previousSourceId": "airplay2" }
    }
  ],
  "count": 2,
  "pollIntervalMs": 5000
}

Settings API

Endpoint Method Description
/api/devialet/settings GET Get plugin settings
/api/devialet/settings POST Update plugin settings

Settings Properties

Property Type Description
pollIntervalMs int State polling interval in milliseconds (1000-60000)
showNotifications bool Show toast notifications for connection changes
autoConnectOnStartup bool Auto-connect to saved devices on TMRemote startup
Note: If {id} is omitted, the first connected device is used.

Events

The plugin publishes events when device state changes. These events can trigger TMRemote scenarios and are available via the REST API.

Event Types

Event Description Data
DevialetVolumeChanged Volume level changed volume, previousVolume
DevialetSourceChanged Audio source changed sourceId, sourceType, sourceName, previousSourceId
DevialetPlaybackChanged Playback state changed action, playingState, isPlaying
DevialetMuteChanged Mute state changed isMuted
DevialetNightModeChanged Night mode toggled isEnabled
DevialetPowerChanged Power off or restart issued action ("off" or "restart")
DevialetBluetoothAdvertising Bluetooth pairing mode started started
DevialetConnectionChanged Device connected or disconnected isConnected, reason, address

Event Sources

Events are fired from two sources:

Polling Interval: Configure the poll interval in TMRemote settings or via the /api/devialet/settings endpoint. Lower intervals provide faster detection but increase network traffic.

Technical Notes

Devialet IP Control Server

The Devialet speaker has an embedded HTTP server for IP Control. Important characteristics:

Important: The Devialet IP Control server cannot handle multiple simultaneous HTTP requests. The plugin makes sequential API calls to avoid overloading the speaker's embedded server, which would result in HTTP 503 "Service Unavailable" errors.

Smart Volume Acceleration

The plugin implements smart volume control matching the behavior of slPhantomRemote:

This uses SetVolumeAsync() with a calculated value rather than the API's volumeUp/volumeDown endpoints (which only step by 1).

Optical/Digital Sources

Some source types cannot be paused (optical, HDMI, analog inputs). For these sources, the plugin automatically uses mute/unmute instead of play/pause.

Night Mode

Night Mode availability depends on firmware version:

The plugin tries both endpoints automatically.

Troubleshooting

Device Not Found

Commands Fail or Timeout

Volume Slider Not Updating

Events Not Firing

Sources Not Showing

Reference

This plugin is based on the Devialet IP Control API as documented in slPhantomRemote. For detailed API specifications, see the slPhantomRemote documentation.

Top