.
This commit is contained in:
@@ -196,6 +196,6 @@ Die vollständige Version liegt in:
|
|||||||
|
|
||||||
| Version | Datum | Änderungen |
|
| Version | Datum | Änderungen |
|
||||||
|----------|--------|------------|
|
|----------|--------|------------|
|
||||||
| v1.0.0 | 2025-10-27 | Erste Veröffentlichung |
|
| v0.0.1 | 2025-10-27 | Erste Veröffentlichung |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,96 +1,96 @@
|
|||||||
AWTRIX NowPlaying – Sonos → AWTRIX Custom App (ioBroker)
|
# 🎵 AWTRIX NowPlaying – Sonos → AWTRIX Custom App (ioBroker)
|
||||||
|
|
||||||
Zeigt den aktuell laufenden Song von Sonos als eigene AWTRIX Custom-App an:
|
Zeigt den aktuell laufenden Song von **Sonos** als eigene **AWTRIX Custom-App** an:
|
||||||
🎵 Künstler — Titel (Album) – hält sich per Keep-Alive in der Rotation, solange ein Titel läuft.
|
`🎵 Künstler — Titel (Album)` – hält sich per Keep-Alive in der Rotation, solange ein Titel läuft.
|
||||||
|
|
||||||
Getestet mit ioBroker (Javascript Adapter) + MQTT Adapter und einer AWTRIX mit MQTT-Support für Custom-Apps.
|
> Getestet mit ioBroker (Javascript Adapter) + MQTT Adapter und einer AWTRIX mit MQTT-Support für Custom-Apps.
|
||||||
|
|
||||||
Features
|
---
|
||||||
|
|
||||||
Liest Titel/Artist/Album aus Sonos-Datenpunkten.
|
## 🚀 Features
|
||||||
|
|
||||||
Baut automatisch die Anzeige: 🎵 Künstler — Titel (Album).
|
- Liest **Titel / Artist / Album** aus Sonos-Datenpunkten
|
||||||
|
- Baut automatisch die Anzeige: `🎵 Künstler — Titel (Album)`
|
||||||
|
- **Keep-Alive**: hält die App aktiv, solange ein Titel vorhanden ist
|
||||||
|
- Automatisches **Entfernen** der App, sobald keine Titelinfos mehr da sind
|
||||||
|
- Optionales **FORCE_SWITCH**: bei jedem Refresh auf die App umschalten
|
||||||
|
- **Debounce-Logik** (200 ms) gegen Flattern bei Trackwechseln
|
||||||
|
|
||||||
Keep-Alive: hält die App per Refresh aktiv, solange der Titel vorhanden ist.
|
---
|
||||||
|
|
||||||
Automatisches Entfernen der App, sobald keine Titelinfos mehr da sind.
|
## 🧩 Voraussetzungen
|
||||||
|
|
||||||
Optionales FORCE_SWITCH: bei jedem Refresh auf die App umschalten.
|
- **ioBroker** mit:
|
||||||
|
- Javascript Adapter (zum Ausführen des Skripts)
|
||||||
|
- MQTT Adapter (als Client zum MQTT-Broker; verwendet `sendMessage2Client`)
|
||||||
|
- Sonos Adapter (liefert `current_title`, `current_artist`, `current_album`)
|
||||||
|
- **AWTRIX** (mit MQTT-Support für Custom-Apps)
|
||||||
|
- Ein erreichbarer **MQTT-Broker** (falls nicht in ioBroker integriert)
|
||||||
|
|
||||||
Debounce-Logik (200 ms) gegen „Datenpunkt-Flattern“ bei Trackwechseln.
|
---
|
||||||
|
|
||||||
Voraussetzungen
|
## ⚙️ Installation
|
||||||
|
|
||||||
ioBroker mit:
|
1. In ioBroker den **Javascript-Adapter** öffnen → neues Script `NowPlaying Sonos → AWTRIX` anlegen
|
||||||
|
2. Den Code aus `nowplaying_sonos_awtrix.js` einfügen
|
||||||
|
3. Folgende Werte anpassen:
|
||||||
|
- `MQTT_INSTANCE`, `AWTRIX_PREFIX`
|
||||||
|
- Sonos-Datenpunkte unter `DP.title / artist / album`
|
||||||
|
4. Skript starten
|
||||||
|
→ Beim ersten laufenden Titel sollte auf der AWTRIX die App **NowPlaying** erscheinen.
|
||||||
|
|
||||||
Javascript Adapter (zum Ausführen des Skripts)
|
---
|
||||||
|
|
||||||
MQTT Adapter (als Client zum MQTT-Broker; verwendet sendMessage2Client)
|
## 🔧 Konfiguration
|
||||||
|
|
||||||
Sonos Adapter (liefert current_title, current_artist, current_album)
|
| Variable | Typ | Standardwert | Beschreibung |
|
||||||
|
|--------------------|---------|---------------|--------------|
|
||||||
|
| `MQTT_INSTANCE` | String | `"mqtt.0"` | ioBroker-Instanzname des MQTT-Adapters |
|
||||||
|
| `AWTRIX_PREFIX` | String | `"awtrix"` | MQTT-Prefix der AWTRIX (z. B. `awtrix/custom/NowPlaying`) |
|
||||||
|
| `APP_NAME` | String | `"NowPlaying"`| Name der Custom-App |
|
||||||
|
| `LIFETIME_SEC` | Number | `600` | Lebensdauer der App in Sekunden (wenn kein Refresh kommt) |
|
||||||
|
| `KEEPALIVE_SEC` | Number | `10` | Intervall für den Refresh in Sekunden |
|
||||||
|
| `FORCE_SWITCH` | Boolean | `false` | Bei jedem Refresh auf die App umschalten |
|
||||||
|
| `ICON_MUSIC` | Number | `29944` | AWTRIX-Icon-ID |
|
||||||
|
| `COLOR_RGB` | Array | `[255,255,255]` | RGB-Farbe für Text |
|
||||||
|
| `TEXT_CASE` | Number | `2` | Textdarstellung (0 = normal, 1 = upper, 2 = smart) |
|
||||||
|
| `DP.title` | String | Beispiel | Sonos-Datenpunkt `current_title` |
|
||||||
|
| `DP.artist` | String | Beispiel | Sonos-Datenpunkt `current_artist` |
|
||||||
|
| `DP.album` | String | Beispiel | Sonos-Datenpunkt `current_album` |
|
||||||
|
|
||||||
AWTRIX (mit MQTT-Support für Custom-Apps)
|
> ⚠️ **Hinweis:** Passe die Sonos-Datenpunkte an dein Gerät an – IP und Struktur können variieren.
|
||||||
|
|
||||||
Ein erreichbarer MQTT-Broker (falls nicht in ioBroker integriert)
|
---
|
||||||
|
|
||||||
Installation
|
## 🧠 Funktionsweise
|
||||||
|
|
||||||
In ioBroker den Javascript-Adapter öffnen → neues Script NowPlaying Sonos → AWTRIX anlegen.
|
1. **Trigger:**
|
||||||
|
```js
|
||||||
|
on({ id: [DP.title, DP.artist, DP.album], change: "ne" }, scheduleUpdate);
|
||||||
|
```
|
||||||
|
Bei Änderung wird `updateAwtrix()` mit Debounce (200 ms) aufgerufen.
|
||||||
|
|
||||||
Den Skript-Code aus nowplaying_sonos_awtrix.js einfügen und speichern.
|
2. **Logik:**
|
||||||
|
- Kein Titel → App entfernen, Keep-Alive stoppen
|
||||||
|
- Neuer Track → Text bauen, sofort publishen, Keep-Alive starten
|
||||||
|
- Gleicher Track → Keep-Alive aktualisiert regelmäßig selbst
|
||||||
|
|
||||||
Prüfen/Anpassen:
|
3. **Keep-Alive:**
|
||||||
|
Alle `KEEPALIVE_SEC` Sekunden wird `publishCustom()` aufgerufen.
|
||||||
|
Sobald kein Titel mehr vorhanden ist → App wird automatisch entfernt.
|
||||||
|
|
||||||
MQTT_INSTANCE, AWTRIX_PREFIX
|
---
|
||||||
|
|
||||||
Sonos-Datenpunkte unter DP.title / artist / album
|
## 📡 MQTT-Themen & Payloads
|
||||||
|
|
||||||
Skript starten.
|
|
||||||
Beim ersten laufenden Titel sollte auf der AWTRIX die App NowPlaying erscheinen.
|
|
||||||
|
|
||||||
Konfiguration
|
|
||||||
Konstante Typ Default Beschreibung
|
|
||||||
MQTT_INSTANCE String "mqtt.0" ioBroker-Instanzname des MQTT-Adapters (für sendTo(..., "sendMessage2Client", ...)).
|
|
||||||
AWTRIX_PREFIX String "awtrix" MQTT-Prefix deiner AWTRIX (z. B. awtrix → Themen wie awtrix/custom/NowPlaying).
|
|
||||||
APP_NAME String "NowPlaying" Name der Custom-App (wird als Topic und Anzeigename genutzt).
|
|
||||||
LIFETIME_SEC Number 600 Lebensdauer der App in Sekunden, falls kein Refresh mehr kommt.
|
|
||||||
KEEPALIVE_SEC Number 10 Refresh-Intervall in Sekunden, solange Titel vorhanden ist.
|
|
||||||
FORCE_SWITCH Boolean false Bei jedem Refresh aktiv auf die App schalten (awtrix/switch).
|
|
||||||
ICON_MUSIC Number 29944 AWTRIX-Icon-ID für die Anzeige.
|
|
||||||
COLOR_RGB Array [255,255,255] Textfarbe als RGB.
|
|
||||||
TEXT_CASE Number 2 Textdarstellung lt. AWTRIX (z. B. 0=normal, 1=upper, 2=smart).
|
|
||||||
DP.title String Beispiel Sonos-Datenpunkt current_title.
|
|
||||||
DP.artist String Beispiel Sonos-Datenpunkt current_artist.
|
|
||||||
DP.album String Beispiel Sonos-Datenpunkt current_album.
|
|
||||||
|
|
||||||
Hinweis: Passe die Sonos-DPs an dein Gerät an (IP/Struktur im Sonos-Adapter kann variieren).
|
|
||||||
|
|
||||||
Funktionsweise (Kurz)
|
|
||||||
|
|
||||||
Trigger: on({ id: [title, artist, album], change: "ne" })
|
|
||||||
Bei Änderung wird mit Debounce (200 ms) updateAwtrix() aufgerufen.
|
|
||||||
|
|
||||||
Logik:
|
|
||||||
|
|
||||||
Wenn kein Titel/Artist/Album: App entfernen, Keep-Alive stoppen.
|
|
||||||
|
|
||||||
Bei neuem Track: Text bauen → sofort publishen → Keep-Alive-Timer starten.
|
|
||||||
|
|
||||||
Bei gleichem Track: nichts tun; Keep-Alive veröffentlicht regelmäßig neu.
|
|
||||||
|
|
||||||
Keep-Alive:
|
|
||||||
Alle KEEPALIVE_SEC Sekunden publishCustom(text); sobald title leer ist → App entfernen.
|
|
||||||
|
|
||||||
MQTT-Themen & Payloads
|
|
||||||
|
|
||||||
Custom-App veröffentlichen:
|
|
||||||
Topic:
|
|
||||||
|
|
||||||
|
### Custom-App veröffentlichen
|
||||||
|
**Topic:**
|
||||||
|
```
|
||||||
<AWTRIX_PREFIX>/custom/<APP_NAME>
|
<AWTRIX_PREFIX>/custom/<APP_NAME>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Payload:**
|
||||||
Payload (Beispiel):
|
```json
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "NowPlaying",
|
"name": "NowPlaying",
|
||||||
"text": "🎵 Artist — Title (Album)",
|
"text": "🎵 Artist — Title (Album)",
|
||||||
@@ -99,109 +99,103 @@ Payload (Beispiel):
|
|||||||
"textCase": 2,
|
"textCase": 2,
|
||||||
"lifetime": 600
|
"lifetime": 600
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
Auf App umschalten (optional):
|
### Auf App umschalten (optional)
|
||||||
Topic:
|
**Topic:**
|
||||||
|
```
|
||||||
<AWTRIX_PREFIX>/switch
|
<AWTRIX_PREFIX>/switch
|
||||||
|
```
|
||||||
|
|
||||||
|
**Payload:**
|
||||||
Payload:
|
```json
|
||||||
|
|
||||||
{ "name": "NowPlaying" }
|
{ "name": "NowPlaying" }
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
App entfernen:
|
### App entfernen
|
||||||
Topic:
|
**Topic:**
|
||||||
|
```
|
||||||
<AWTRIX_PREFIX>/custom/<APP_NAME>
|
<AWTRIX_PREFIX>/custom/<APP_NAME>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Payload:**
|
||||||
Payload:
|
```json
|
||||||
|
|
||||||
{ "name": "NowPlaying", "lifetime": 1 }
|
{ "name": "NowPlaying", "lifetime": 1 }
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
Das Skript sendet per sendTo("mqtt.X", "sendMessage2Client", { topic, message, retain:false, qos:0 }).
|
> Das Skript sendet über:
|
||||||
|
> ```js
|
||||||
|
> sendTo("mqtt.X", "sendMessage2Client", { topic, message, retain: false, qos: 0 });
|
||||||
|
> ```
|
||||||
|
|
||||||
Anpassungen & Tipps
|
---
|
||||||
Mehrere Sonos-Player
|
|
||||||
|
|
||||||
Lege das Skript mehrfach an (kopieren) und passe je Instanz:
|
## 🛠️ Anpassungen & Tipps
|
||||||
|
|
||||||
APP_NAME (z. B. NowPlaying_Kueche)
|
### Mehrere Sonos-Player
|
||||||
|
- Skript **duplizieren**
|
||||||
|
- `APP_NAME` (z. B. `NowPlaying_Kueche`) und `DP.*` anpassen
|
||||||
|
|
||||||
DP.* auf die jeweiligen Player-Datenpunkte
|
### Anzeige-Dauer / Refresh
|
||||||
|
- Anzeige-Frequenz → `KEEPALIVE_SEC`
|
||||||
|
- Ablaufzeit ohne Refresh → `LIFETIME_SEC`
|
||||||
|
|
||||||
Kürzere/Längere Anzeige
|
### Direkter Wechsel auf NowPlaying
|
||||||
|
- `FORCE_SWITCH = true` setzen, um bei jedem Refresh direkt zu wechseln
|
||||||
|
|
||||||
Häufigkeit der Refreshs: KEEPALIVE_SEC
|
---
|
||||||
|
|
||||||
Max. Lebensdauer ohne Refresh: LIFETIME_SEC
|
## 🧰 Troubleshooting
|
||||||
|
|
||||||
Rotation „hart“ anstoßen
|
| Problem | Mögliche Ursache / Lösung |
|
||||||
|
|----------|----------------------------|
|
||||||
|
| Keine Anzeige | MQTT-Broker nicht erreichbar, falsches Prefix oder kein Song aktiv |
|
||||||
|
| App verschwindet zu schnell | `LIFETIME_SEC` erhöhen |
|
||||||
|
| Zu häufige Refreshs | `KEEPALIVE_SEC` erhöhen |
|
||||||
|
| Falsches Icon oder Textformat | `ICON_MUSIC` oder `TEXT_CASE` anpassen |
|
||||||
|
| App spammt Rotation | `FORCE_SWITCH = false` lassen |
|
||||||
|
| Keine Daten von Sonos | Sonos-Adapter prüfen (korrekte Player-IDs?) |
|
||||||
|
|
||||||
Setze FORCE_SWITCH = true, wenn viele Apps in der Rotation sind und du bei jedem Refresh zu NowPlaying springen willst.
|
---
|
||||||
|
|
||||||
Troubleshooting
|
## 💾 Code
|
||||||
|
|
||||||
Keine Anzeige auf der AWTRIX
|
Die vollständige Version liegt in:
|
||||||
|
`nowplaying_sonos_awtrix.js`
|
||||||
|
|
||||||
Prüfe, ob der MQTT-Broker erreichbar ist und der ioBroker-MQTT-Adapter verbunden ist.
|
---
|
||||||
|
|
||||||
AWTRIX_PREFIX korrekt? (z. B. awtrix vs. matrix/awtrix).
|
## 🔒 Sicherheit
|
||||||
|
|
||||||
APP_NAME stimmt? (Switch bezieht sich auf denselben Namen)
|
- MQTT-Zugangsdaten werden im ioBroker-MQTT-Adapter verwaltet
|
||||||
|
- Kein Retain (`retain:false`), QoS = 0 → kein Risiko veralteter Nachrichten
|
||||||
|
|
||||||
Läuft mindestens ein Titel (also DP.title nicht leer)?
|
---
|
||||||
|
|
||||||
Payload kommt an, aber keine/komische Darstellung
|
## 📜 Lizenz
|
||||||
|
|
||||||
ICON_MUSIC existiert? Ggf. andere Icon-ID testen.
|
**MIT License** – siehe `LICENSE`
|
||||||
|
|
||||||
TEXT_CASE anpassen (0/1/2 – abhängig von deiner AWTRIX-Firmware).
|
---
|
||||||
|
|
||||||
App verschwindet zu schnell
|
## 👏 Credits
|
||||||
|
|
||||||
LIFETIME_SEC erhöhen.
|
- **Autor:** Mike
|
||||||
|
- **AWTRIX-Projekt:** Community & Entwickler
|
||||||
|
- **ioBroker Adapter:** Sonos, MQTT & Javascript
|
||||||
|
|
||||||
Prüfen, ob KEEPALIVE_SEC zu groß ist (seltener Refresh).
|
---
|
||||||
|
|
||||||
App „spammt“ die Rotation
|
## 🧾 Changelog
|
||||||
|
|
||||||
FORCE_SWITCH = false belassen.
|
| Version | Datum | Änderungen |
|
||||||
|
|----------|--------|------------|
|
||||||
|
| v0.0.1 | 2025-10-27 | Erste Veröffentlichung |
|
||||||
|
|
||||||
KEEPALIVE_SEC erhöhen (weniger häufige Refreshs).
|
---
|
||||||
|
|
||||||
Sonos-Datenpunkte ändern sich nicht
|
|
||||||
|
|
||||||
Sonos-Adapter prüfen; korrekte Instanz und Player-IDs?
|
|
||||||
|
|
||||||
Testweise die DPs im Objekt-Baum beobachten.
|
|
||||||
|
|
||||||
Code
|
|
||||||
|
|
||||||
Die vollständige Version liegt in nowplaying_sonos_awtrix.js.
|
|
||||||
|
|
||||||
Sicherheit
|
|
||||||
|
|
||||||
MQTT-Zugangsdaten werden im ioBroker-MQTT-Adapter gepflegt (nicht im Skript).
|
|
||||||
|
|
||||||
Das Skript sendet ohne Retain (retain:false) und mit qos:0.
|
|
||||||
|
|
||||||
Lizenz
|
|
||||||
|
|
||||||
MIT License – siehe LICENSE.
|
|
||||||
|
|
||||||
Credits
|
|
||||||
|
|
||||||
Idee & Umsetzung: Mike
|
|
||||||
|
|
||||||
AWTRIX Projekt & Icons: Respect an die AWTRIX-Community
|
|
||||||
|
|
||||||
ioBroker Adapter: Danke an die Maintainer von Sonos/MQTT/JS
|
|
||||||
|
|
||||||
Changelog
|
|
||||||
|
|
||||||
v0.0.1 – Erste Veröffentlichung
|
|
||||||
|
|||||||
Reference in New Issue
Block a user