Pepperdash.Essentials.Plugins.Bluesound.Api
1.0.0
dotnet add package Pepperdash.Essentials.Plugins.Bluesound.Api --version 1.0.0
NuGet\Install-Package Pepperdash.Essentials.Plugins.Bluesound.Api -Version 1.0.0
<PackageReference Include="Pepperdash.Essentials.Plugins.Bluesound.Api" Version="1.0.0" />
<PackageVersion Include="Pepperdash.Essentials.Plugins.Bluesound.Api" Version="1.0.0" />
<PackageReference Include="Pepperdash.Essentials.Plugins.Bluesound.Api" />
paket add Pepperdash.Essentials.Plugins.Bluesound.Api --version 1.0.0
#r "nuget: Pepperdash.Essentials.Plugins.Bluesound.Api, 1.0.0"
#:package Pepperdash.Essentials.Plugins.Bluesound.Api@1.0.0
#addin nuget:?package=Pepperdash.Essentials.Plugins.Bluesound.Api&version=1.0.0
#tool nuget:?package=Pepperdash.Essentials.Plugins.Bluesound.Api&version=1.0.0
Bluesound BluOS API Essentials Plugin (c) 2026
License
Provided under MIT license
Overview
PepperDash Essentials plugin for Bluesound BluOS network audio devices. Communicates with the BluOS Custom Integration API over HTTP (port 11000) to provide music service/input selection, preset/playlist management, transport controls, and volume control of the local zone.
Core feature set:
- Select service or physical input from
/Browseroot menu (paginated, up to 10/page) - List and select saved presets/playlists (paginated, up to 10/page)
- Play, pause, next track, previous track
- Shuffle toggle with feedback
- Volume control — local zone (set, up, down with feedback)
- Now-playing feedback: track name, artist, album, album art URL
- Online/offline detection
Device type name: bluesoundapi
Minimum Essentials version: 2.24.0
Dependencies
- PepperDash Essentials ≥ 2.24.0 (referenced via NuGet as
PepperDashEssentials) - Target framework: .NET 4.7.2 (Crestron 4-Series)
Device Configuration
Add a device entry to your Essentials configuration JSON. The type must be bluesoundapi. The control object uses tcpIp method with the Bluesound device's IP address and port 11000.
{
"key": "bluesound-1",
"name": "Bluesound Node",
"type": "bluesoundapi",
"group": "audioPlayer",
"properties": {
"control": {
"method": "tcpIp",
"tcpSshProperties": {
"address": "192.168.1.100",
"port": 11000
}
},
"pollTimeMs": 30000,
"warningTimeoutMs": 60000,
"errorTimeoutMs": 120000,
"volumeStepPercent": 2
}
}
| Property | Type | Default | Description |
|---|---|---|---|
control.tcpSshProperties.address |
string | — | IP address of the Bluesound device |
control.tcpSshProperties.port |
int | 11000 |
BluOS HTTP API port |
pollTimeMs |
long | 30000 |
How often (ms) to poll /Status |
warningTimeoutMs |
long | 60000 |
Unused (reserved for future monitor) |
errorTimeoutMs |
long | 120000 |
Unused (reserved for future monitor) |
volumeStepPercent |
int | 2 |
Step size for VolumeUp/VolumeDown (1–10) |
defaultService |
string | — | Pin the browse root to a preferred service name (e.g. "SoundMachine"). The plugin auto-navigates into this service on load and constrains Home/Back navigation to its root level. |
Bridge Configuration
Add an EISC bridge entry and reference the device key.
{
"key": "eisc-bluesound",
"name": "EISC Bluesound",
"type": "eiscApiAdvanced",
"group": "api",
"properties": {
"control": {
"method": "ipidTcp",
"ipid": "A0",
"tcpSshProperties": {
"address": "127.0.0.2",
"port": 0
}
},
"devices": [
{
"deviceKey": "bluesound-1",
"joinStart": 1
}
]
}
}
The joinStart value offsets all join numbers in the table below.
With joinStart: 1 the join numbers are as listed. With joinStart: 101 add 100 to each join number.
Join Map
Digital Joins
| Join | Name | Direction | Description |
|---|---|---|---|
| 1 | IsOnline |
To SIMPL | High when device is reachable |
| 2 | Play |
From SIMPL | Press to resume playback |
| 2 | IsPlaying |
To SIMPL | High when state is play or stream |
| 3 | Pause |
From SIMPL | Press to pause playback |
| 3 | IsPaused |
To SIMPL | High when state is pause |
| 4 | ShuffleState |
To/From SIMPL | FB = current shuffle state · Press = toggle shuffle |
| 5 | ServiceHomePageVisible |
To SIMPL | High when not at root browse level — shows Home button |
| 5 | NextTrack |
From SIMPL | Press to skip to next track |
| 6 | ServiceBackPageVisible |
To SIMPL | High when not at root browse level — shows Back button |
| 6 | PreviousTrack |
From SIMPL | Press to go to previous track |
| 7 | VolumeUp |
From SIMPL | Press to increment volume by step |
| 8 | VolumeDown |
From SIMPL | Press to decrement volume by step |
| 9 | PollServiceList |
From SIMPL | Press to re-poll the service/input list |
| 10 | PollPresetList |
From SIMPL | Press to re-poll the preset list |
| 11 | ServiceHomePage |
From SIMPL | Return service browse to root level |
| 12 | ServiceNextPage |
From SIMPL | Advance service list to next page |
| 12 | ServiceNextPageVisible |
To SIMPL | High when a next service page exists |
| 13 | ServicePreviousPage |
From SIMPL | Go to previous service list page |
| 13 | ServicePreviousPageVisible |
To SIMPL | High when a previous service page exists |
| 14 | ServiceBack |
From SIMPL | Go back one level in service browse hierarchy |
| 16 | PresetHomePage |
From SIMPL | Reset preset list to first page |
| 17 | PresetNextPage |
From SIMPL | Advance preset list to next page |
| 17 | PresetNextPageVisible |
To SIMPL | High when a next preset page exists |
| 18 | PresetPreviousPage |
From SIMPL | Go to previous preset list page |
| 18 | PresetPreviousPageVisible |
To SIMPL | High when a previous preset page exists |
| 19 | PresetBack |
From SIMPL | Reset preset list to first page (alias for PresetHomePage) |
| 21–30 | SelectServices |
From SIMPL | Press join 21+n to select service slot n (0-based) on current page |
| 31–40 | SelectPresets |
From SIMPL | Press join 31+n to select preset slot n (0-based) on current page |
Analog Joins
| Join | Name | Direction | Description |
|---|---|---|---|
| 1 | Status |
To SIMPL | 0 = offline · 2 = online |
| 2 | VolumeLevel |
To/From SIMPL | FB = current volume (0–100) · Set = target volume (0–100) |
| 3 | ServicePageNumber |
To SIMPL | Current service list page number (1-based) |
| 4 | PresetPageNumber |
To SIMPL | Current preset list page number (1-based) |
Serial Joins
| Join | Name | Direction | Description |
|---|---|---|---|
| 1 | DeviceName |
To SIMPL | Essentials device name |
| 2 | CurrentTrackName |
To SIMPL | Now-playing track title |
| 3 | CurrentArtist |
To SIMPL | Now-playing artist |
| 4 | CurrentAlbum |
To SIMPL | Now-playing album |
| 5 | AlbumArtUrl |
To SIMPL | Album art absolute URL (relative paths resolved to http://ip:port/...) |
| 6 | CurrentServicesMenu |
To SIMPL | Current services menu name ("Home" at root, service name when browsing) |
| 21–30 | ServiceNames |
To SIMPL | Service/input names for current page (slots 1–10) |
| 31–40 | PresetNames |
To SIMPL | Preset names for current page (slots 1–10) |
References
- BluOS Custom Integration API v1.7 —
documents/BluOS-Custom-Integration-API_v1.7.pdf - PepperDash Essentials framework — https://github.com/PepperDash/Essentials
- PepperDash plugin library — https://github.com/PepperDash
- pyblu reference client (endpoint mapping) — https://github.com/LouisChrist/pyblu
- Home Assistant Bluesound integration (reference architecture) — https://github.com/home-assistant/core/tree/dev/homeassistant/components/bluesound
Build
cd src
dotnet build epi-bluesound-api.4Series.csproj
The build outputs a .cplz package in /output/ ready for deployment to a 4-Series processor.
Generating NuGet Package
A NuGet package is automatically generated on build. To modify package metadata, edit the following in the .csproj:
PackageId— NuGet package namePackageProjectUrl— should match this repo URLAssemblyTitle— DLL file name shown on processor
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net472 is compatible. net48 was computed. net481 was computed. |
-
.NETFramework 4.7.2
- PepperDashEssentials (>= 2.28.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 91 | 8/27/2026 |
| 1.0.0-request-testing.12 | 58 | 8/27/2026 |
| 1.0.0-request-testing.11 | 63 | 8/27/2026 |
| 1.0.0-request-testing.10 | 62 | 8/27/2026 |
| 1.0.0-request-testing.9 | 62 | 8/27/2026 |
| 1.0.0-request-testing.8 | 59 | 8/27/2026 |
| 1.0.0-request-testing.7 | 65 | 8/27/2026 |
| 1.0.0-request-testing.6 | 60 | 8/27/2026 |
| 1.0.0-request-testing.5 | 61 | 8/27/2026 |
| 1.0.0-request-testing.4 | 59 | 8/27/2026 |
| 1.0.0-request-testing.3 | 60 | 8/27/2026 |
| 1.0.0-request-testing.2 | 60 | 8/27/2026 |
| 1.0.0-request-testing.1 | 62 | 8/27/2026 |
| 1.0.0-initial-development.10 | 73 | 5/1/2026 |
| 1.0.0-initial-development.9 | 61 | 5/1/2026 |
| 1.0.0-initial-development.8 | 58 | 5/1/2026 |
| 1.0.0-initial-development.7 | 63 | 5/1/2026 |
| 1.0.0-initial-development.6 | 60 | 5/1/2026 |
| 1.0.0-initial-development.5 | 65 | 5/1/2026 |
| 1.0.0-initial-development.4 | 70 | 5/1/2026 |