| Developer: | Open Source Plugins |
| Category: | A/V and IR Equipment |
| Github: | Github Repo |
| License: | MIT License |
| Assistance: | Get help! |
| Plugin ID: | com.ssi.indigoplugin.Sonos |
| Latest release: | v2025.2.10 released on Sept. 20, 2026 |
| Release downloaded: | 2 times |
| Requires: | Indigo v2023.2.0 or higher |
| (Check the Releases tab below for older releases that may have different requirements) | |
| Download release v2025.2.4 |
Control your entire Sonos system from Indigo — playback, volume, grouping, favourites, streaming services, announcements, soundbar tuning, and native Sonos alarms — as first-class Indigo devices, actions, and triggers.
Current version: 2025.2.10 · Requires Indigo 2025.2+ (API 3.4) · Bundled SoCo 0.30.9 · Python 3
This release makes the plugin fully self-healing around unreachable players — powered off, dropped off WiFi, or moved to a new IP address — and closes a long-standing event-subscription gap that could freeze a group's playback state.
offline with its playback state set to STOPPED — a powered-off player can no longer sit showing "playing", and a grouped coordinator no longer stamps its own playing state onto an offline group member.The plugin only subscribed to transport events for players that were group coordinators at startup. A player that started as a group member — or recovered from offline with a stale state — and was later made coordinator of a new group never delivered its "playing" events, so the whole group's states froze at STOPPED. Every player (except bonded satellites like Subs and surrounds) is now subscribed, matching Home Assistant's approach — group role changes at any time just work, and grouped players now receive their own volume events too.
Full details for every release are in the version history below.
This release overhauls the announcement system end-to-end and fixes several bugs reported against 2025.2.3.
say (the previous NSSpeechSynthesizer API is deprecated and renders silence for modern voices), the voice menu lists only voices that actually work, and output is Sonos-compatible 44.1 kHz WAV (the old AIFF output was an AIFF-C container Sonos rejects).Announcements now snapshot every target zone (SoCo Snapshot/Restore — the same mechanism Home Assistant uses; selectable in Plugin Config, on by default) and afterwards rebuild the exact pre-announcement state: original groups re-form (including group members that weren't part of the announcement), standalone zones return to standalone, volumes/mutes restore, and interrupted music resumes at the same track and position. See the Known Limitation in the version history: cloud-queue sources (Alexa-initiated, Spotify Connect, AirPlay) cannot be programmatically resumed.
Players on a separate VLAN must be able to reach the Indigo Mac on tcp/8889 (announcements), tcp/8888 (album art), and tcp/1400 (event notifications) — a one-way firewall breaks all three silently while normal control keeps working. The plugin now detects players on a different subnet at startup and logs the exact rules needed, and a fetch watchdog reports when a player never pulled the announcement file.
The plugin log file always captures full debug detail (nothing is lost when the Event Log is set to normal), while Event Log noise — album-art fetch retries, per-event state chatter, startup floods — has been sharply reduced. Album-art fetches use longer timeouts, and the last unbounded HTTP calls got timeouts.
This release is a major reliability and completeness overhaul, addressing the failure cascade reported in IndigoDomotics/Sonos#16 and restoring a number of actions that had silently stopped working.
Previously, a single unplugged speaker could freeze the whole plugin — minutes-long startups, a config dialog that would not open, reloads needing a force-kill, and log storms hammering healthy players. All of that is fixed:
offline device state in Indigo, and skipped (with a 30-second back-off) instead of blocking the plugin in serial 10–20 s network timeouts.DeviceProperties fetches against dead players.If your players live on a dedicated subnet (e.g. Sonos on 192.168.30.0/24, Indigo Mac on 192.168.1.0/24):
An automated end-to-end audit (Actions.xml → plugin.py → handler) found 10 actions that were offered in the UI but did nothing (logging "Unknown or unsupported action") or crashed. All are restored and verified:
| Action | Status |
|---|---|
| Play RadioTime Favourite Station | Restored (was breaking alarm/announcement action groups) |
| Bass / Treble (set to level) | Restored — no handler existed at all |
| Night Mode | Restored |
| Play Queue | Restored |
| Sleep Timer | Restored |
| TV Input (soundbars) | Restored |
| Dump URI (diagnostics) | Restored |
| Pandora Thumbs Up / Thumbs Down | Restored — handler method was missing |
| Test SiriusXM Channel | Fixed malformed action definition + missing callback |
| Line-In | Fixed in 2025.2.1 (#15) |
Also fixed in this area:
urllib.unquote) crashed favourites; fixed. Favourite routing also corrected: x-sonosapi-hls: is a generic HLS scheme (Sonos Radio HD, Apple Music radio, …) and is no longer misrouted to the SiriusXM handler — only URIs carrying channel-linear:<guid> are SiriusXM. Generic HLS/HTTP favourites now play via their stored URI + metadata.ZP_SiriusXM missing props, Q_Crossfade arity) fixed.Feature set cross-checked against Home Assistant's Sonos integration; the following were added using the same SoCo/UPnP semantics:
Equalizer / soundbar controls (Actions → Sonos → Equalizer):
Native Sonos alarm management (Actions → Sonos → Alarms):
07:00 — Master Bedroom — DAILY — enabled), with Enable / Disable / Toggle and an optional volume override. Perfect for "disable the wake-up alarm on public holidays" style automations.Sonos.indigoPlugin — Indigo installs and enables it.auto. Used to load favourites/playlists/stations.192.168.30.0/24). If your Mac isn't directly on that subnet, the plugin automatically uses the routed interface — you don't need to change anything.Players that are offline when the plugin starts show an offline device state and are picked up automatically when they reappear.
Each ZonePlayer device exposes rich states usable in triggers and control pages, including transport state, track metadata + album art, volume/mute/bass/treble, grouping (Grouped, GROUP_Coordinator, GROUP_Name, ZonePlayerUUIDsInGroup), queue flags (repeat/shuffle/crossfade), and identity (ZP_LocalUID, model, serial).
Grouped players mirror the coordinator's enriched metadata states, so a control page bound to any group member shows what's actually playing.
%%v:12345678%%, %%d:12345678:stateId%%, %%t:"%-I:%M %p"%% — so announcements can speak live variable values, device states, and timestampsoffline — the plugin probes it every 60 s and will restore it automatically once reachable. Nothing to do.2025.2.10 — Fixes a flood of "subscription failed to renew" warnings: re-subscribing a player (offline recovery, subscription watchdog) left the old subscription objects' auto-renew threads running as orphans — once expired they can never renew, so each fired a warning every cycle forever. Old subscriptions are now properly torn down before re-subscribing (renew thread cancelled first — unsubscribing an already-expired subscription raises before reaching its own timer cancel), and the renew-failure warning is rate-limited to one per minute in the Event Log. Also: bonded satellites are now identified by topology visibility instead of model name — ordinary speakers bonded as rear surrounds (e.g. two Play:1s behind a Beam) no longer produce "subscription returned None SID" errors at startup.
2025.2.9 — Runtime offline detection and self-healing: a player that becomes unreachable while the plugin is running — powered off, dropped off WiFi, or moved to a new DHCP address (e.g. after a router restart re-deals every lease) — is now detected within ~3 minutes even on an idle system (an active liveness probe sweeps all players every minute; failed commands accelerate detection), marked offline with its state set to STOPPED, and handed to the background recovery loop, which reconnects when it returns or re-finds it by its Sonos ID at its new address automatically. An offline grouped player no longer inherits its coordinator's "playing" state, topology refreshes skip unreachable players instead of stalling and flooding the log, and soco-internal fetch failures log one concise warning. Event subscriptions are now established for every player (not only group coordinators at startup) — previously a player that was a group slave when the plugin started never received transport events, so if it later became a group's coordinator, that group's playback state froze at STOPPED. DHCP reservations for your players remain best practice.
2025.2.8 — Grouped players no longer show a phantom "playing" state. A grouped slave's own transport reports PLAYING for its link stream to the coordinator regardless of whether any audio is playing — the plugin now ignores slave link-stream transport events (a slave's state follows its coordinator) and verifies coordinatorship against the player's authoritative CurrentURI instead of soco's per-player group view, which can go stale.
2025.2.7 — Event-subscription watchdog: device states no longer freeze after a failed subscription renewal (the cause of "states stop updating after a few days until a plugin restart") — lapsed subscriptions are detected within a minute and re-subscribed automatically, with a log warning the moment a renewal fails. Major reduction in per-event overhead: group refresh now runs only for the player the event came from (not whenever any group existed anywhere), identical album art is no longer re-downloaded several times per track change, unchanged states are no longer re-pushed to grouped slaves, and a malformed cached group entry that polluted every evaluation pass is cleaned up. Announcement/action dialogs now advertise Indigo substitution support (always worked; now documented). Slow/offline players log one concise warning instead of a two-part error.
2025.2.6 — Amazon Polly announcements fixed: the Polly voice-loading routine had been lost in a years-old refactor, leaving the action dialog's Voice menu empty and saved actions failing with ValidationException ... voiceId ''. Voices now load at startup (Loaded Polly Voices... [N] in the log); actions saved while the menu was broken fall back to a default voice with a log warning — re-open and re-save the action to pick your voice.
2025.2.5 — Per-player controls fixed for grouped zones: Volume Up/Down, Volume, Mute, Bass, Treble, and all soundbar EQ actions now target the specific ZonePlayer named in the action instead of being redirected to the group coordinator (Group Volume/Group Mute remain the group-wide controls). Announcement group-restore now skips bonded satellites (surrounds/Sub bonded to a soundbar), eliminating harmless "could not re-join" warnings on home-theater setups.
2025.2.4 — Announcement system overhaul: multi-zone announcements fixed (grouping semantics regression), full group & playback restore after announcements — zones return to their exact pre-announcement groups (including group members that weren't part of the announcement) and music resumes at the same track/position via SoCo Snapshot/Restore (selectable in Plugin Config, on by default, with the legacy flow as fallback). Apple text-to-speech reworked onto macOS say (voice menu now lists only voices that actually render; output is Sonos-compatible 44.1 kHz WAV). Polly/IVONA/Pandora/SiriusXM credentials and Apple voices load at startup again. TTS audio unified onto the announcement HTTP server's folder (TTS previously 404'd; File announcements could probe a stale file's duration). Cross-VLAN diagnostics: startup warning + a fetch watchdog name the exact firewall rules needed (players must reach the Mac on tcp/8889 announcements, tcp/8888 album art, tcp/1400 event notifications). DHCP-moved players self-heal by matching their RINCON id in discovery and updating the device address automatically. Plugin log file now always captures full debug detail; Event Log noise sharply reduced. Album-art fetches use longer timeouts and no longer warn.
Known limitation — announcement playback resume: sources Sonos exposes as cloud queues — Alexa-initiated music, Spotify Connect, and AirPlay streams — cannot be restarted programmatically (Sonos provides no API to resume them; Home Assistant has the same limitation). After an announcement, grouping and volume are still restored for those zones, but that music will not auto-resume. Local queue playback, Sonos favourites, and radio streams all resume normally, at the same track and position.
2025.2.3 — Offline-player resilience (probe gating, UID caching, bounded timeouts, clean shutdown), routed-VLAN support, announcement topology-storm fix, state-list resync, 10 restored actions, favourites routing fixes, new Equalizer/soundbar actions, native Sonos alarm management. See PR #17.
2025.2.1 — Line-In action fix (#15); HTTPStreamer port leak and Polly prefs fixes (#14); dynamic install-path resolution (#13).
1.0.2 — SoCo 0.30.9 upgrade; rewritten subscriptions with fallback; VLAN-aware discovery; corrected volume/bass/treble controls; SiriusXM login + channel processing; Pandora auth ported to Python 3; artwork/metadata server; group metadata mirroring; diagnostic menu dumps.
Originally by Vic Solomon; Python 3 port and ongoing maintenance by the Indigo community (IndigoDomotics), with contributions from forum users and plugin contributors. Uses the SoCo library. Not affiliated with Sonos, Inc.
See LICENSE.
| Released on: | Sept. 20, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 2 times |
| Download this release | |
Follow-up to the 2025.2.9 reliability work (#23). Field testing surfaced a flood of:
🩺 A Sonos event subscription failed to renew (Cannot renew subscription after expiry) — will re-subscribe on the next health check
An expired subscription can never be renewed (only replaced), but its soco auto-renew thread keeps firing the auto_renew_fail hook every cycle forever. The flood wasn't many failing subscriptions — it was a handful of orphaned zombie renew threads from subscriptions that had already been replaced:
socoSubscribe overwrote the device's subscription dict on every re-subscribe (offline recovery, subscription watchdog), dropping the old Subscription objects with their renew threads still running. It now tears down existing subscriptions first — renew thread cancelled (best-effort _auto_renew_cancel()), then unsubscribe only if the lease is still alive.unsubscribe() first — which raises on an already-expired subscription before reaching its own internal timer cancel; the exception was swallowed and the zombie thread lived on. The renew thread is now cancelled before unsubscribing.Rule of thumb now applied consistently (and matching the existing deviceStopComm pattern): a soco Subscription must have _auto_renew_cancel() called before being dropped, always.
Field report on 2025.2.9: two Play:1 speakers bonded to a Beam as rear surrounds spammed "subscription returned None SID" errors at startup. The subscribe-all change skips bonded satellites by model name (Sub/surround/Boost) — which misses surrounds that are ordinary models. Satellites are now also detected by topology visibility (bonded members are invisible zones — the same is_visible flag the announcement group-restore uses), answered from soco's cached zone group state.
PluginVersion 2025.2.10; README version-history entry included.
| Released on: | Sept. 18, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 5 times |
| Download this release | |
Sonos 2025.2.9 — runtime offline detection & self-heal; event subscriptions for all players
Extends the startup-only self-heal (2025.2.5) to players that die or move IP while the plugin is running. Field case: a router reboot re-dealt DHCP leases — five players moved IP at once, producing endless "No route to host" errors until a plugin restart. Shaped by five rounds of live power-pull testing on a real system.
Runtime offline detection & recovery
SOAPSend counts connection-level failures per IP (read timeouts excluded — a busy player is not a gone player); any success clears the record. A 60-second check marks devices with 3+ failures that also fail a reachability probe as offline (state set to STOPPED — a dead player cannot be "playing") and hands them to the existing deferred-retry path, which reconnects when the player returns or re-finds it by RINCON id at its new address and updates the Indigo device automatically. Active liveness sweep: detection cannot rely on command failures alone — an idle dead player receives no commands and sends no events, so it previously kept its last state forever. Every cycle now probes each enabled player (milliseconds for live players; only dead ones pay the 1s timeout), guaranteeing detection within ~3 minutes even on a fully idle system. Quiet failure handling
A vanishing player must not flood the Event Log or stall the plugin:
updateZoneGroupStates gates on a cached probe — it runs per-device on every topology propagation pass, and each call to a dead player blocked 5 seconds and logged an error pair. soco-internal fetches (its lazy /xml/1.xml schema loads, hardcoded 10s timeout) bypass the plugin's SOAP layer entirely; connection-class failures surfacing through the topology/dump paths now log one concise warning and feed the failure counter. Both slave-sync paths skip offline devices — the coordinator was re-stamping PLAYING onto a powered-off slave on every event. refresh_group_membership survives soco's brief no-group-info window right after a player reboots (was: 'NoneType' object has no attribute 'coordinator'). Event subscriptions for all players — fixes a frozen-STOPPED trap
_subscribe_with_retry skipped AVTransport/RenderingControl subscriptions for any device whose GROUP_Coordinator state was "false" at subscribe time. A player that started as a group slave (or recovered from offline with a stale slave state) and was later made coordinator of a new group never delivered PLAYING events — the whole group's states froze at STOPPED. This long-standing hole was masked before 2025.2.7 by per-event coordinator polling that the efficiency work removed.
All players are now subscribed except bonded satellites (Sub/surrounds/Boost) — the same policy Home Assistant uses. Phantom slave state cannot return (the 2025.2.8 x-rincon link-stream filter blocks it), and slaves finally receive their own volume events as a bonus.
PluginVersion 2025.2.9; README version-history entry included.
| v2025.2.8 | Requires Indigo v2023.2.0+ | Released Sept. 15, 2026 | Event-subscription watchdog, Per-event overhead cut ~10x, Phantom "PLAYING" on grouped players |
| Released on: | Sept. 15, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 11 times |
| Download this release | |
Three structural reliability improvements, all diagnosed on live systems.
2025.2.7 — Event-subscription watchdog: fixes "states stop updating after a few days" Sonos event subscriptions are timed leases that soco auto-renews on a background thread. When one renewal fails (player reboot, WiFi blip), soco's auto-renew thread dies silently — that player never delivers another event, and its Indigo states freeze until the plugin is restarted.
The config UI's EventCheck/SubscriptionCheck intervals turned out to be another surviving fossil: the prefs are read at startup, but the subscription-checking loop that used them was lost in an old refactor — nothing was watching.
check_event_subscriptions() runs every 60s: checks each subscription's time_left (local arithmetic when healthy; the lease timestamp stops updating when auto-renew dies, so time_left decays to 0 within one lease period). On expiry: unsubscribe remnants + full re-subscribe, gated behind a 1s reachability probe. An auto_renew_fail hook logs a warning the moment a renewal fails. Worst case a player's events pause one lease period plus one check tick, then self-heal — no restart.
2025.2.7 — Per-event overhead cut ~10x Group refresh scoped to the event's device — the old gate was "does any group exist anywhere?", so with any standing group every track tick on every player triggered network track/transport/artwork fetches plus a topology walk. Grouping changes arrive as ZGT events and keep their own handling. Album art dedupe — the same artwork was re-downloaded several times per track change; last-fetched URI now remembered per coordinator. Changed-only slave sync — was 18 state pushes per slave per event, mostly identical (art file copy gated on file mtime, not the fixed-URL ZP_ART value). Malformed cache-entry cleanup — a name-keyed group entry with no coordinator polluted every evaluation pass; removed and its writer fixed.
2025.2.8 — Phantom "PLAYING" on grouped players Grouped zones slaved to a stopped coordinator showed stuck PLAYING; stopping playback set everything STOPPED and they flipped back. Live ground truth: a grouped slave's own AVTransport "plays" the x-rincon: link stream, which reports PLAYING regardless of whether the coordinator is producing audio — a slave's transport state is meaningless; only the coordinator's counts (Home Assistant ignores slave transports for the same reason). Two paths trusted it anyway:
The event handler wrote ZP_STATE straight from slave AVTransport events — now skipped when the event's track URI starts with x-rincon:; a slave's real state arrives via the coordinator's slave-sync. refresh_group_membership derived coordinatorship from the player's soco.group view, which can go stale (seen live: a slave's soco object claimed the slave was its own coordinator). Coordinatorship is now verified against the player's authoritative GetMediaInfo CurrentURI (x-rincon: == slave), resolving the real coordinator by UID. Field-tested: grouped stop stays stopped; states track the coordinator.
Also included Slow/offline players log one concise warning from SOAPSend instead of a two-part error. Announcement dialog and README advertise Indigo substitution support in Message/Volume fields (always worked via plugin.substitute; now documented per SDK guidance). PluginVersion 2025.2.8; README version-history entries included.
| v2025.2.6 | Requires Indigo v2023.2.0+ | Released Sept. 4, 2026 | Restores Lost Polly Voice Loader and Fixes ValidationException `voiceId` |
| Released on: | Sept. 4, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 26 times |
| Download this release | |
Restores lost Polly voice loader and fixes ValidationException voiceId.
| v2025.2.5 | Requires Indigo v2023.2.0+ | Released Aug. 30, 2026 | Grouped-slave Volume/Mute/EQ Targets the Named Player |
| Released on: | Aug. 30, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 18 times |
| Download this release | |
Grouped-slave volume/mute/EQ target the named player; skip bonded satellites in announcement restore
| Released on: | Aug. 9, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 41 times |
| Download this release | |
Numerous bug fixes. See #18 for details.
| v2025.2.3 | Requires Indigo v2023.2.0+ | Released Aug. 8, 2026 | Fix Startup/Reload Hangs, Restore Lost Actions, Add HA-Parity Feature… |
| Released on: | Aug. 8, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 24 times |
| Download this release | |
See #17 for a full description of the changes.
| Released on: | Aug. 4, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 29 times |
| Download this release | |
| Released on: | May 7, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 100 times |
| Download this release | |
Full Changelog: https://github.com/IndigoDomotics/Sonos/compare/2025.0.1...2025.2.0
| Released on: | April 30, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 61 times |
| Download this release | |
Full Changelog: https://github.com/IndigoDomotics/Sonos/compare/2024.0.9...2025.0.1
| Released on: | Jan. 26, 2024 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 328 times |
| Download this release | |
The previous required version of lxml (4.9.4) wasn't properly support on versions of macOS prior to Big Sur (11). LXML required version upped to 5.1.0.
| Released on: | Jan. 18, 2024 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 101 times |
| Download this release | |
Requires Indigo 2023.2 - Will not run on earlier versions! Improved python package handling Code improvements
| v2023.1.0 | Requires Indigo v2022.1.2+ | Released Dec. 16, 2023 | Update Plugin to Use latest SoCo Package |
| Released on: | Dec. 16, 2023 |
| Requires: | Indigo v2022.1.2+ |
| Downloaded: | 157 times |
| Download this release | |
The SoCo package was updated to version 0.30.0 on 14th December 2023 and is now included in the plugin - see SoCo 0.30.0 Release
| Released on: | Aug. 7, 2023 |
| Requires: | Indigo v2022.1.2+ |
| Downloaded: | 216 times |
| Download this release | |
Requires Indigo 2022.1 Suppress SSDP Debug/Error Messages
| Released on: | March 28, 2020 |
| Requires: | Indigo v7.0.2 thru v2022.2 |
| Downloaded: | 64 times |
| Download this release | |
Variable substitution for Volume and Group Volume actions.
| Released on: | Oct. 19, 2019 |
| Requires: | Indigo v7.0.2 thru v2022.2 |
| Downloaded: | 55 times |
| Download this release | |
Reduced some error logging Can play Spotify playlists and tracks from Sonos Favorites Library Updates: SoCo v0.18 with customizations requests 2.22.0 *Twisted v19.7.0
Indigo v7
| Released on: | April 7, 2019 |
| Requires: | Indigo v7.0.2 thru v2022.2 |
| Downloaded: | 59 times |
| Download this release | |
Refactored loading Sonos Favorites
Indigo v7 Sonos Firmware v10.1
| Released on: | April 7, 2019 |
| Requires: | Indigo v7.0.2 thru v2022.2 |
| Downloaded: | 57 times |
| Download this release | |
Repackaged with correct Zope library
Indigo v7 Sonos Firmware 10.1
| Released on: | April 7, 2019 |
| Requires: | Indigo v7.0.2 thru v2022.2 |
| Downloaded: | 60 times |
| Download this release | |
Code Fixes for Sonos Firmware v10.1 Library Updates: Twisted v18.9.0 attr v18.1.0 pyOpenSSL 18.0.0 zope.interfaces v4.6.0 gTTS v2.0.0 gTTS-token v1.1.1 mutagen 1.41.1 requests 2.20.1 *urllib3 1.24.1
Indigo v7 Sonos v10.1
| Released on: | March 24, 2018 |
| Requires: | Indigo v7.0.2 thru v2022.2 |
| Downloaded: | 57 times |
| Download this release | |
Indigo v7+
| Released on: | March 13, 2018 |
| Requires: | Indigo v7.0.2 thru v2022.2 |
| Downloaded: | 56 times |
| Download this release | |
Indigo v7+