Skip to content

Commit 7dad749

Browse files
committed
Release 5.8.2 beta 8 service fallback
1 parent 922acb2 commit 7dad749

10 files changed

Lines changed: 125 additions & 58 deletions

CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
11
# Changelog
22

3+
## 5.8.2-beta.8 - 2026-06-03
4+
5+
Focused beta follow-up for issue #28 after beta 7 exposed the next Home Assistant service-call layer.
6+
7+
Release focus:
8+
9+
- Keeps exposed `music_assistant` services as a valid integration signal even when the config entry reports `not_loaded`.
10+
- Still passes the discovered `config_entry_id` to Home Assistant `music_assistant` service calls when the services require it, fixing `required key not provided @ data['config_entry_id']` library failures.
11+
- Removes `queue_id` from the Home Assistant `music_assistant.get_queue` diagnostic path so HA receives only the selected `entity_id`.
12+
- Improves Diagnostic v3 wording for generic HA fallback players, so Alexa/other fallback entities are no longer described as strict Music Assistant-marked players.
13+
- Softens queue diagnostics when a fallback selected player has no Music Assistant queue identity.
14+
15+
Validation:
16+
17+
- Targeted lint and runtime/settings regression tests passed before the release version bump.
18+
- Full lint, full Vitest, production build, and release artifact sync were run for the final beta package.
19+
320
## 5.8.2-beta.7 - 2026-06-02
421

522
Targeted beta follow-up for issue #28, Diagnostic v3, and the phone Queue Flow entry point.

README.md

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ https://github.com/user-attachments/assets/a0076e6e-0352-40f8-ac37-35737e717a80
4747

4848
<p align="center">
4949
<a href="https://github.com/r11a/homeii-music-flow"><img alt="stable version" src="https://img.shields.io/badge/stable-5.8.1-gold"></a>
50-
<a href="https://github.com/r11a/homeii-music-flow/releases/tag/v5.8.2-beta.7"><img alt="beta version" src="https://img.shields.io/badge/beta-5.8.2--beta.7-8A63D2"></a>
50+
<a href="https://github.com/r11a/homeii-music-flow/releases/tag/v5.8.2-beta.8"><img alt="beta version" src="https://img.shields.io/badge/beta-5.8.2--beta.8-8A63D2"></a>
5151
<img alt="Home Assistant" src="https://img.shields.io/badge/Home%20Assistant-Dashboard-41BDF5">
5252
<img alt="Music Assistant" src="https://img.shields.io/badge/Music%20Assistant-required-7C5CFF">
5353
<img alt="Sendspin" src="https://img.shields.io/badge/Sendspin-browser%20player-18B6FF">
@@ -63,24 +63,23 @@ HOMEii Flow is a custom Home Assistant Dashboard card for Music Assistant. It tu
6363

6464
HOMEii Flow started from my own daily use of Home Assistant and Music Assistant. I wanted it to feel less like a technical dashboard widget and more like a real music app inside Home Assistant, so a lot of thought went into the flow, touch interactions, Hebrew/RTL comfort, wall-tablet behavior, mobile details, and the small moments that make choosing music feel natural at home.
6565

66-
## 5.8.2 Beta 7
66+
## 5.8.2 Beta 8
6767

68-
HOMEii Flow 5.8.2 Beta 7 focuses on issue #28, Diagnostic v3, and a cleaner phone Queue Flow entry point.
68+
HOMEii Flow 5.8.2 Beta 8 is a focused follow-up for issue #28 after the beta 7 diagnostics exposed the next service-call layer.
6969

70-
- Lets the card keep working through the Home Assistant Music Assistant integration even when the MA config entry lookup reports `not_loaded` but HA still exposes `music_assistant` services.
71-
- Uses generic HA `media_player` entities as compatibility fallback targets only when Music Assistant services exist.
72-
- Improves diagnostics to Diagnostic v3 with integration signals, strict/fallback player markers, queue providers, library providers, browser-blocked Direct API classification, and the existing privacy redaction.
73-
- Treats browser-blocked Direct API/CORS failures as optional when the HA integration path is available, instead of making the whole card look broken.
74-
- Removes the phone Queue Flow button above the artwork and keeps Queue Flow available only as a Quick Action option.
75-
- Removes the invalid `limit` parameter from the HA `music_assistant.get_queue` diagnostic path.
76-
- Keeps the Beta 1 through Beta 6 artwork, Music Assistant compatibility, Danish localization, diagnostics, and performance fixes.
70+
- Keeps the beta 7 integration signal fallback, but now still passes the discovered `config_entry_id` to Home Assistant `music_assistant` service calls when those services require it.
71+
- Fixes library/service calls that failed with `required key not provided @ data['config_entry_id']` in some Home Assistant / Music Assistant setups.
72+
- Removes `queue_id` from the Home Assistant `music_assistant.get_queue` diagnostic path so HA only receives the selected `entity_id`.
73+
- Improves Diagnostic v3 wording for generic HA fallback players so Alexa/other `media_player` entities are not described as strict Music Assistant-marked players.
74+
- Makes queue diagnostics less fatal when the selected fallback player has no `active_queue` / `queue_id` identity.
75+
- Keeps the Beta 1 through Beta 7 artwork, Music Assistant compatibility, Danish localization, diagnostics, and performance fixes.
7776

78-
Beta download: [v5.8.2-beta.7](https://github.com/r11a/homeii-music-flow/releases/tag/v5.8.2-beta.7)
77+
Beta download: [v5.8.2-beta.8](https://github.com/r11a/homeii-music-flow/releases/tag/v5.8.2-beta.8)
7978

8079
Stable users can remain on 5.8.1. Beta users should hard refresh Home Assistant or use:
8180

8281
```text
83-
/local/community/homeii-music-flow/homeii-music-flow.js?v=5.8.2-beta.7
82+
/local/community/homeii-music-flow/homeii-music-flow.js?v=5.8.2-beta.8
8483
```
8584

8685
## 5.8.1 Hotfix Release
@@ -1024,7 +1023,8 @@ src/core/ extracted foundation helpers
10241023
src/config/ config validators
10251024
tests/ regression coverage
10261025
scripts/release.mjs release sync tooling
1027-
RELEASE_NOTES_5.8.2-beta.7.md detailed GitHub release notes for the current beta
1026+
RELEASE_NOTES_5.8.2-beta.8.md detailed GitHub release notes for the current beta
1027+
RELEASE_NOTES_5.8.2-beta.7.md previous beta release notes
10281028
RELEASE_NOTES_5.8.2-beta.6.md previous beta release notes
10291029
RELEASE_NOTES_5.8.2-beta.5.md previous beta release notes
10301030
RELEASE_NOTES_5.8.2-beta.4.md previous beta release notes
@@ -1050,7 +1050,7 @@ npm run lint
10501050
npm test
10511051
```
10521052

1053-
Current packaged version: `5.8.2-beta.7`
1053+
Current packaged version: `5.8.2-beta.8`
10541054

10551055
## Release Readiness
10561056

@@ -1104,6 +1104,7 @@ Credit and thanks:
11041104

11051105
- [Local deployment guide](./LOCAL_DEPLOYMENT.md)
11061106
- [Publishing checklist](./PUBLISHING.md)
1107+
- [5.8.2 Beta 8 release notes](./RELEASE_NOTES_5.8.2-beta.8.md)
11071108
- [5.8.2 Beta 7 release notes](./RELEASE_NOTES_5.8.2-beta.7.md)
11081109
- [5.8.2 Beta 6 release notes](./RELEASE_NOTES_5.8.2-beta.6.md)
11091110
- [5.8.2 Beta 5 release notes](./RELEASE_NOTES_5.8.2-beta.5.md)

RELEASE_NOTES_5.8.2-beta.8.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# HOMEii Music Flow 5.8.2-beta.8
2+
3+
This beta is a focused follow-up for issue #28 after beta 7 exposed the next Home Assistant service-call layer.
4+
5+
## Fixed
6+
7+
- Keeps the beta 7 Music Assistant integration fallback, but still passes the discovered `config_entry_id` to Home Assistant `music_assistant` service calls when those services require it.
8+
- Fixes library/service calls that failed with `required key not provided @ data['config_entry_id']` in some Home Assistant / Music Assistant setups.
9+
- Removes `queue_id` from the Home Assistant `music_assistant.get_queue` diagnostic path so HA receives only the selected `entity_id`.
10+
- Improves Diagnostic v3 wording for generic HA fallback players, so Alexa/other `media_player` entities are not described as strict Music Assistant-marked players.
11+
- Makes queue diagnostics less fatal when the selected fallback player has no `active_queue` / `queue_id`.
12+
13+
## Testing Notes
14+
15+
After installing, hard refresh the Home Assistant dashboard and make sure the Lovelace resource URL/cache key is updated to:
16+
17+
```text
18+
/local/community/homeii-music-flow/homeii-music-flow.js?v=5.8.2-beta.8
19+
```
20+
21+
For issue #28, please test with `ma_url` empty first, then run the in-card diagnostics:
22+
23+
```text
24+
Settings > General > Settings Source: In-card Settings
25+
Settings > Music Assistant > Diagnostics > Run diagnostics > Copy report
26+
```
27+
28+
The copied report should show:
29+
30+
```text
31+
Diagnostics: v3
32+
Version: 5.8.2-beta.8
33+
```
34+
35+
Please check whether Library pages now return items instead of `required key not provided @ data['config_entry_id']`.

dist/core/base-music-card.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,7 +1095,7 @@ export function createHomeiiBaseMusicCard({
10951095
_versionedAssetUrl(url) {
10961096
const value = String(url || "").trim();
10971097
if (!value || /^data:/i.test(value) || /[?&]v=/.test(value)) return value;
1098-
const version = typeof HOMEII_CARD_VERSION === "string" ? HOMEII_CARD_VERSION : "5.8.2-beta.7";
1098+
const version = typeof HOMEII_CARD_VERSION === "string" ? HOMEII_CARD_VERSION : "5.8.2-beta.8";
10991099
return `${value}${value.includes("?") ? "&" : "?"}v=${encodeURIComponent(version)}`;
11001100
}
11011101

@@ -10071,7 +10071,9 @@ export function createHomeiiBaseMusicCard({
1007110071
return explicit;
1007210072
}
1007310073
if (this._resolvedConfigEntryId && !force) {
10074-
return this._hasUsableMusicAssistantConfigEntry() ? this._resolvedConfigEntryId : "";
10074+
return (this._hasUsableMusicAssistantConfigEntry() || this._hasMusicAssistantServiceSignal())
10075+
? this._resolvedConfigEntryId
10076+
: "";
1007510077
}
1007610078
try {
1007710079
const entries = await this._withTimeout(this._hass.connection.sendMessagePromise({
@@ -10086,9 +10088,9 @@ export function createHomeiiBaseMusicCard({
1008610088
this._resolvedConfigEntryId = preferred?.entry_id || "";
1008710089
this._resolvedConfigEntryState = String(preferred?.state || "").trim();
1008810090
if (!this._resolvedConfigEntryId || preferred?.state && preferred.state !== "loaded") {
10089-
if (this._hasMusicAssistantServiceSignal()) {
10091+
if (this._resolvedConfigEntryId && this._hasMusicAssistantServiceSignal()) {
1009010092
this._state.musicAssistantIssueMessage = "";
10091-
return "";
10093+
return this._resolvedConfigEntryId;
1009210094
}
1009310095
this._handleMusicAssistantIssue(preferred?.state ? `Music Assistant entry ${preferred.state}` : this._musicAssistantSetupMessage());
1009410096
return "";
@@ -10220,9 +10222,7 @@ export function createHomeiiBaseMusicCard({
1022010222

1022110223
async _fetchMusicAssistantQueueSnapshot(player) {
1022210224
if (!player?.entity_id) return null;
10223-
const queueId = this._queueIdForPlayer(player);
1022410225
const payload = { entity_id: player.entity_id };
10225-
if (queueId) payload.queue_id = queueId;
1022610226
const snapshot = await this._callService("get_queue", payload, { includeConfigEntryId: false });
1022710227
return this._normalizeQueueSnapshot(snapshot, player.entity_id);
1022810228
}

dist/homeii-music-flow.js

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19341,7 +19341,7 @@ function createHomeiiBaseMusicCard({
1934119341
return explicit;
1934219342
}
1934319343
if (this._resolvedConfigEntryId && !force) {
19344-
return this._hasUsableMusicAssistantConfigEntry() ? this._resolvedConfigEntryId : "";
19344+
return this._hasUsableMusicAssistantConfigEntry() || this._hasMusicAssistantServiceSignal() ? this._resolvedConfigEntryId : "";
1934519345
}
1934619346
try {
1934719347
const entries = await this._withTimeout(this._hass.connection.sendMessagePromise({
@@ -19353,9 +19353,9 @@ function createHomeiiBaseMusicCard({
1935319353
this._resolvedConfigEntryId = preferred?.entry_id || "";
1935419354
this._resolvedConfigEntryState = String(preferred?.state || "").trim();
1935519355
if (!this._resolvedConfigEntryId || preferred?.state && preferred.state !== "loaded") {
19356-
if (this._hasMusicAssistantServiceSignal()) {
19356+
if (this._resolvedConfigEntryId && this._hasMusicAssistantServiceSignal()) {
1935719357
this._state.musicAssistantIssueMessage = "";
19358-
return "";
19358+
return this._resolvedConfigEntryId;
1935919359
}
1936019360
this._handleMusicAssistantIssue(preferred?.state ? `Music Assistant entry ${preferred.state}` : this._musicAssistantSetupMessage());
1936119361
return "";
@@ -19442,9 +19442,7 @@ function createHomeiiBaseMusicCard({
1944219442
}
1944319443
async _fetchMusicAssistantQueueSnapshot(player) {
1944419444
if (!player?.entity_id) return null;
19445-
const queueId = this._queueIdForPlayer(player);
1944619445
const payload = { entity_id: player.entity_id };
19447-
if (queueId) payload.queue_id = queueId;
1944819446
const snapshot = await this._callService("get_queue", payload, { includeConfigEntryId: false });
1944919447
return this._normalizeQueueSnapshot(snapshot, player.entity_id);
1945019448
}
@@ -25998,9 +25996,9 @@ function ensureHaEditorComponents() {
2599825996
} catch (_) {
2599925997
}
2600025998
}
26001-
const HOMEII_CARD_VERSION = "5.8.2-beta.7";
26002-
const HOMEII_BROWSER_EDITOR_TAG = "homeii-music-flow-browser-editor-v5827";
26003-
const HOMEII_MOBILE_EDITOR_TAG = "homeii-music-flow-editor-v5827";
25999+
const HOMEII_CARD_VERSION = "5.8.2-beta.8";
26000+
const HOMEII_BROWSER_EDITOR_TAG = "homeii-music-flow-browser-editor-v5828";
26001+
const HOMEII_MOBILE_EDITOR_TAG = "homeii-music-flow-editor-v5828";
2600426002
const AMBIENT_LIGHT_PAIR_PLAYER_PREFIX = "__homeii_ambient_light_pair_player_";
2600526003
const AMBIENT_LIGHT_PAIR_LIGHTS_PREFIX = "__homeii_ambient_light_pair_lights_";
2600626004
const HomeiiEditorLocale = Object.freeze({
@@ -55007,6 +55005,9 @@ class HomeiiMusicFlowBaseCard extends HomeiiBaseMusicCard {
5500755005
if (!markers.length) markers.push("no strict MA markers");
5500855006
return markers.join(", ");
5500955007
}
55008+
_diagnosticIsStrictMusicAssistantPlayer(player = null, hassEntities = this._hass?.entities || {}) {
55009+
return !!(this._isDirectMaPlayer?.(player) || HomeiiPlayersFoundation.isMusicAssistantPlayer(player, hassEntities?.[player?.entity_id]));
55010+
}
5501055011
async _diagnosticQueueRows(add, selectedPlayer = null) {
5501155012
if (!selectedPlayer) {
5501255013
add("fail", "Queue snapshot", "No selected player is available, so queue checks cannot run.");
@@ -55041,7 +55042,9 @@ class HomeiiMusicFlowBaseCard extends HomeiiBaseMusicCard {
5504155042
} else if (best) {
5504255043
add("warn", "Queue snapshot", `${detail}. Queue API is reachable but returned no items; this can be normal for an idle/empty queue.`);
5504355044
} else {
55044-
add("fail", "Queue snapshot", detail);
55045+
const strictPlayer = this._diagnosticIsStrictMusicAssistantPlayer(selectedPlayer);
55046+
const fallbackPlayer = !strictPlayer && this._isGenericMusicAssistantFallbackPlayer?.(selectedPlayer);
55047+
add(fallbackPlayer && !queueId ? "warn" : "fail", "Queue snapshot", fallbackPlayer && !queueId ? `${detail}. The selected player is using the generic HA fallback and has no active_queue/queue_id, so Home Assistant may not be able to resolve a Music Assistant queue for it.` : detail);
5504555048
}
5504655049
const queueItems = Array.isArray(best?.snapshot?.items) ? best.snapshot.items : [];
5504755050
if (!queueItems.length) {
@@ -55236,10 +55239,10 @@ class HomeiiMusicFlowBaseCard extends HomeiiBaseMusicCard {
5523655239
add("fail", "Selected player", "No selected player is available.");
5523755240
} else {
5523855241
const selectedName = selectedPlayer.attributes?.friendly_name || selectedPlayer.entity_id || "";
55239-
const selectedIsMa = this._isMusicAssistantPlayer(selectedPlayer);
55240-
const selectedFallback = !selectedIsMa && this._isGenericMusicAssistantFallbackPlayer?.(selectedPlayer);
55242+
const selectedStrictMa = this._diagnosticIsStrictMusicAssistantPlayer(selectedPlayer, hassEntities);
55243+
const selectedFallback = !selectedStrictMa && this._isGenericMusicAssistantFallbackPlayer?.(selectedPlayer);
5524155244
const excluded = this._isPlayerExcluded?.(selectedPlayer);
55242-
add((selectedIsMa || selectedFallback) && !excluded ? "ok" : "warn", "Selected player", excluded ? "The selected player is currently excluded in HOMEii settings." : selectedIsMa ? "Selected player has Music Assistant markers." : selectedFallback ? "Selected player has no strict MA markers, but integration fallback can use it." : "Selected player does not look usable for Music Assistant.", `${selectedName} | ${this._diagnosticPlayerMarkerSummary(selectedPlayer, hassEntities)}`);
55245+
add((selectedStrictMa || selectedFallback) && !excluded ? "ok" : "warn", "Selected player", excluded ? "The selected player is currently excluded in HOMEii settings." : selectedStrictMa ? "Selected player has strict Music Assistant markers." : selectedFallback ? "Selected player has no strict MA markers; HOMEii is using the generic Home Assistant fallback." : "Selected player does not look usable for Music Assistant.", `${selectedName} | ${this._diagnosticPlayerMarkerSummary(selectedPlayer, hassEntities)}`);
5524355246
}
5524455247
if (!maUrl) {
5524555248
add(hasIntegrationServices ? "ok" : "info", "ma_url", "Empty is OK for the normal Home Assistant integration path. Direct API and Sendspin need a separate direct Music Assistant URL.", "(empty)");

dist/localization/index.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import en from "./en.js?v=5.8.2-beta.7-8468eb524b";
2-
import da from "./da.js?v=5.8.2-beta.7-7f86f3e425";
3-
import es from "./es.js?v=5.8.2-beta.7-16e5cabf8e";
4-
import fr from "./fr.js?v=5.8.2-beta.7-53901fc467";
5-
import he from "./he.js?v=5.8.2-beta.7-10e3feafaa";
6-
import it from "./it.js?v=5.8.2-beta.7-f7b021fce1";
7-
import lt from "./lt.js?v=5.8.2-beta.7-f34c389d46";
8-
import zh from "./zh.js?v=5.8.2-beta.7-a33bc98f49";
1+
import en from "./en.js?v=5.8.2-beta.8-8468eb524b";
2+
import da from "./da.js?v=5.8.2-beta.8-7f86f3e425";
3+
import es from "./es.js?v=5.8.2-beta.8-16e5cabf8e";
4+
import fr from "./fr.js?v=5.8.2-beta.8-53901fc467";
5+
import he from "./he.js?v=5.8.2-beta.8-10e3feafaa";
6+
import it from "./it.js?v=5.8.2-beta.8-f7b021fce1";
7+
import lt from "./lt.js?v=5.8.2-beta.8-f34c389d46";
8+
import zh from "./zh.js?v=5.8.2-beta.8-a33bc98f49";
99

1010
export const DEFAULT_LANGUAGE = "en";
1111

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "homeii-music-flow",
3-
"version": "5.8.2-beta.7",
3+
"version": "5.8.2-beta.8",
44
"description": "Premium Home Assistant Music Assistant dashboard card with a mobile-first visual player and built-in editor.",
55
"private": true,
66
"license": "MIT",

src/core/base-music-card.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,7 +1095,7 @@ export function createHomeiiBaseMusicCard({
10951095
_versionedAssetUrl(url) {
10961096
const value = String(url || "").trim();
10971097
if (!value || /^data:/i.test(value) || /[?&]v=/.test(value)) return value;
1098-
const version = typeof HOMEII_CARD_VERSION === "string" ? HOMEII_CARD_VERSION : "5.8.2-beta.7";
1098+
const version = typeof HOMEII_CARD_VERSION === "string" ? HOMEII_CARD_VERSION : "5.8.2-beta.8";
10991099
return `${value}${value.includes("?") ? "&" : "?"}v=${encodeURIComponent(version)}`;
11001100
}
11011101

@@ -10071,7 +10071,9 @@ export function createHomeiiBaseMusicCard({
1007110071
return explicit;
1007210072
}
1007310073
if (this._resolvedConfigEntryId && !force) {
10074-
return this._hasUsableMusicAssistantConfigEntry() ? this._resolvedConfigEntryId : "";
10074+
return (this._hasUsableMusicAssistantConfigEntry() || this._hasMusicAssistantServiceSignal())
10075+
? this._resolvedConfigEntryId
10076+
: "";
1007510077
}
1007610078
try {
1007710079
const entries = await this._withTimeout(this._hass.connection.sendMessagePromise({
@@ -10086,9 +10088,9 @@ export function createHomeiiBaseMusicCard({
1008610088
this._resolvedConfigEntryId = preferred?.entry_id || "";
1008710089
this._resolvedConfigEntryState = String(preferred?.state || "").trim();
1008810090
if (!this._resolvedConfigEntryId || preferred?.state && preferred.state !== "loaded") {
10089-
if (this._hasMusicAssistantServiceSignal()) {
10091+
if (this._resolvedConfigEntryId && this._hasMusicAssistantServiceSignal()) {
1009010092
this._state.musicAssistantIssueMessage = "";
10091-
return "";
10093+
return this._resolvedConfigEntryId;
1009210094
}
1009310095
this._handleMusicAssistantIssue(preferred?.state ? `Music Assistant entry ${preferred.state}` : this._musicAssistantSetupMessage());
1009410096
return "";
@@ -10220,9 +10222,7 @@ export function createHomeiiBaseMusicCard({
1022010222

1022110223
async _fetchMusicAssistantQueueSnapshot(player) {
1022210224
if (!player?.entity_id) return null;
10223-
const queueId = this._queueIdForPlayer(player);
1022410225
const payload = { entity_id: player.entity_id };
10225-
if (queueId) payload.queue_id = queueId;
1022610226
const snapshot = await this._callService("get_queue", payload, { includeConfigEntryId: false });
1022710227
return this._normalizeQueueSnapshot(snapshot, player.entity_id);
1022810228
}

0 commit comments

Comments
 (0)