Skill: wegow/archiv (version 1.0.0)

--- name: roon description: > Controls your Roon music system — searching the library and TIDAL, playing tracks, queuing playlists, adjusting volume, skipping tracks, and answering questions about the music library. Use this skill any time the user mentions Roon, wants to play music, create a playlist, control playback, adjust volume, skip a track, asks what's playing, or wants music recommendations based on their library. Trigger even for casual requests like "put something on", "skip this", "turn it up", or "play something relaxing" — this skill has full knowledge of your zones, library, and the API needed to act immediately. --- # Roon Music Controller Your Roon system is controlled via a REST API running in LCX container on Proxmox server. ## API Base ``` http://roonext2.home:3001/api ``` ## CRITICAL: How to make API calls **GET:** ```bash curl -s 'http://roonext2.home:3001/api/status' ``` **POST:** ```bash curl -X POST http://roonext2.home:3001/api/find-and-play \ -H "Content-Type: application/json" \ -d '{ "zone_id": "YOUR_ZONE_ID", "query": "stool pigeon", "type": "Tracks", "action": "Play Now" }' ``` --- ## Zones Replace this table with your own zones. Get them by calling `/api/zones`. | Zone | ID | |------|----| | Schlafzimmer| [REDACTED_SECRET] | | Wohnzimmer| [REDACTED_SECRET] | **How to find your zone IDs:** ```bash curl -s 'http://roonext2.home:3001/api/zones' ``` --- ## Endpoints | Method | Path | Purpose | |--------|------|---------| | GET | `/api/status` | All zones, playback state, now playing | | GET | `/api/zones` | Zone list with IDs | | GET | `/api/search?q=<query>[&type=Tracks\|Albums\|Artists]` | Search library + TIDAL | | POST | `/api/find-and-play` | **Main play endpoint** — search + play in one session | | POST | `/api/transport` | Playback control (play/pause/skip etc.) | | POST | `/api/volume` | Volume control | | GET | `/api/queue/<zone_id>` | View current queue | | POST | `/api/playlist` | Queue multiple tracks in order (save as playlist in Roon app) | | GET | `/api/inspect?q=<query>` | Debug: show Roon's exact action names for a track | | POST | `/api/shuffle` | Enable or disable shuffle for a zone | | POST | `/api/play-album` | **Play an entire album** — natively queues all tracks in order | --- ## play-album (album playback) **Use this endpoint when the user asks to play an album.** Do NOT use `find-and-play` for albums — it only plays the first track. ```json { "zone_id": "...", "query": "Artist Album", "action": "Play Now" } ``` Searches for the album, navigates Roon's full browse hierarchy (Search → Albums → Album page → Play Album → action), and triggers album-level playback. All tracks are queued natively in the correct album order. Supports the same action strings: `Play Now`, `Queue`, `Add Next`, `Start Radio`. ```bash curl -X POST http://roonext2.home:3001/api/play-album \ -H "Content-Type: application/json" \ -d '{ "zone_id": "YOUR_ZONE_ID", "query": "white city a novel", "action": "Play Now" }' ``` --- ## find-and-play (single track playback) ```json { "zone_id": "...", "query": "...", "type": "Tracks", "action": "Play Now" } ``` ### CRITICAL — Roon's exact action labels These are the real strings Roon uses internally. Wrong names silently fall back to Play Now. | Want to... | Use this string | |------------|----------------| | Play immediately (clears queue) | `Play Now` | | Add to end of queue | `Queue` ← **NOT** "Add to Queue" | | Play after current track | `Add Next` ← **NOT** "Play Next" | | Start Roon Radio | `Start Radio` | --- ## transport ```json { "zone_id": "...", "action": "next" } ``` Valid actions: `play`, `pause`, `stop`, `next`, `previous`, `toggle_play_pause` --- --- ## shuffle ```json { "zone_id": "...", "shuffle": true } ``` Set `shuffle` to `true` to enable, `false` to disable. ```bash curl -s -X POST http://roonext2.home3001/api/shuffle \ -H 'Content-Type: application/json' \ -d '{"zone_id": [REDACTED_SECRET], "shuffle": true}' ``` ## volume ```json { "zone_id": "...", "how": "absolute", "value": 40 } ``` Range 0–100. `how`: `absolute`, `relative`, `relative_step` --- ## Playlist pattern ### Option A — /api/playlist (recommended for multi-track lists) Queues all tracks in one API call. First track plays immediately, rest are queued. To save as a permanent Roon playlist: **Queue → ⋮ → Save Queue as Playlist**. > **Note:** Roon's Extension API does not expose "Add to Playlist" to third-party > extensions — only playback actions are available. The queue-then-save workflow > is the supported path. ```json POST /api/playlist { "name": "My 1988 Mix", "zone_id": "YOUR_ZONE_ID", "tracks": [ { "query": "Song One Artist One" }, { "query": "Song Two Artist Two" }, { "query": "Song Three Artist Three" } ] } ``` ```bash curl -s -X POST http://roonext2.home:3001/api/playlist \ -H 'Content-Type: application/json' \ -d '{"name":"My Playlist","zone_id":"YOUR_ZONE_ID","tracks":[{"query":"Song One Artist"},{"query":"Song Two Artist"}]}' ``` ### Option B — individual find-and-play calls (for short lists or fine control) First track → `Play Now` (starts playback, clears existing queue). All subsequent tracks → `Queue`. Use `delay 2` between calls. ```bash ZONE="YOUR_ZONE_ID" API="http://roonext2.home:3001/api/find-and-play" tracks=( "Song One Artist One|Play Now" "Song Two Artist Two|Queue" "Song Three Artist Three|Queue" ) for track in "${tracks[@]}"; do query="${track%%|*}" action="${track##*|}" curl -s -X POST "$API" \ -H 'Content-Type: application/json' \ -d "{\"zone_id\":\"$ZONE\",\"query\":\"$query\",\"type\":\"Tracks\",\"action\":\"$action\"}" sleep 2 done ``` --- ## Your library and taste profile Edit this section to describe your own library and musical taste. Cowork uses this to make smart recommendations and playlist choices on your behalf. ``` YOUR_STREAMING_SERVICE is connected — any track can be played. Local library includes: - Artist — albums Taste profile: describe your taste here so Cowork can recommend music you'll enjoy. ``` --- ## Roon authorisation If the API returns `"Not connected to Roon Core"`, you need to re-authorise: Roon → Settings → Extensions → Enable **"Cowork Controller"** ## Learnings * **verify.artist_match** – check that the artist of a track or album matches the requested artist before adding to the queue. This prevents mismatches like Bobbi Humphrey for a Commodores request. * Embedding future learnings here ensures they are only loaded when the roon‑controller skill is used.

path: MEMORY.md
content: # 🧠 MEMORY.md - Langzeit-Erinnerungen (Molty's Kernwissen)

## 🎬 **Trakt.tv** (seit 13.02.2026)
- **Keys:** `~/.trakt.yaml` (client-id/secret/access-token ✅ ready)
- CLI: `trakt-cli history`

## 💾 **Git-Backup** (seit 13.02.2026)
- **Repo:** https://github.com/WegoW/Openclaw.git
- **Hourly Cron:** MEMORY.md + memory/ auto commit/push (`scripts/backup.sh`)
- **Security:** NIE API-Keys in memory/*.md oder MEMORY.md speichern - immer .env + .gitignore + git-filter-repo für History-Cleanup bei Leaks

## 🎵 **Musik-Präferenz** (seit 02.02.2026)
- **Tool:** `mcporter call unified-hifi-control.hifi_zones`, `.hifi_now_playing zone_id=...`, `.hifi_play(...)` für Roon
- **Default Zone:** Schlafzimmer (`roon:1601dcef8115529daf4cd6807753971fae3e`)
- Wohnzimmer: `roon:160124b4c2dcc52aa8478e05110f7ed25120`

- **Artist-Only Regel**: Bei nur Interpret (kein Album/Song): `hifi_play zone_id=... query="Artist name" action="radio"`
- **Album‑Play‑Regel**: Beim Abspielen eines Albums immer den Artist ans Ende der Query anhängen (z.B. `query="Off the coast of me Kid Creole and the Coconuts"`).

## 🎮 **World of Tanks Console** (seit 05.02.2026)
- **Xbox ID:** 6062761 (wALTERwEGO [BOING])
- **WoTStars:** https://www.wotstars.com/xbox/6062761
- **Scraping:** agent-browser

## 🎥 **IMDb Ratings** (seit 08.02.2026)
- **CSV:** `/root/clawd/docs/imdb_ratings.csv` (3.962 Einträge: Filme/Serien + Ratings/Datum/Genre)
- **Queries:** `awk` oder Python-Scripts
- **Robust Search**: `awk -F',' 'NR>1 {line=tolower($0); if (line ~ /millers/ || line ~ /suchbegriff/) print $0}' /root/clawd/docs/imdb_ratings.csv | head -10` - sucht in ALLEN Feldern case-insensitive (inkl. Quotes/Apostrophe).

## 🏠 **Home Assistant** (seit 04.02.2026)
- ✅ **Nur MCP-Server:** `ha-mcp` via mcporter
- ❌ **Kein Web‑Zugriff:** No curl/browser/web_fetch für `ha.home:8123`
- 📌 **Best‑Practice:** Beim Zugriff immer das Skill **home-assistant-best-practices** verwenden.

 ## 🌐 **Browser Tools** (seit 15.02.2026)
 - **Primär:** agent-browser CLI (via exec) - für Web-Automatisierung/Scraping
- **agent-browser 'find'**: Nur Actions wie click/hover/fill (kein snapshot!). Snapshot separat nach find oder direkt.
 - **Fallback:** native browser tool (nur bei Fehlern)
 - bei browser tool fehler: `exec \"openclaw browser open <url>\"` statt Gateway-Restart

## 📰 **Nachrichten-Quellen** (seit 12.02.2026)
- **Primär RSS:** Tagesschau "Alle Meldungen": https://www.tagesschau.de/infoservices/alle-meldungen-100~rss2.xml

## 🔍 **Web-Suche** (seit 19.02.2026)
- **Primär:** `web_search` Tool (Brave Search API)
- **Fallback:** SearXNG-Server `http://192.168.1.247:8888`
- **Query:** `curl "http://192.168.1.247:8888/search?q=QUERY&format=json"`
- **Verwendung:** Bei Brave Rate-Limit oder anderen Fehlern → SearXNG via exec/curl nutzen

🎵 **Last.fm** (seit 13.02.2026)
- **Keys:** `/root/.openclaw/openclaw.json` → skills.entries.lastfm.env (LASTFM_USER=WegoW / LASTFM_API_KEY)
- API ready ✅

## 📄 **PDF-Generierung** (seit 14.02.2026)
- **ReportLab** (Fallback wenn Pandoc fehlt): `python3 -m pip install reportlab --break-system-packages --no-cache-dir`
- **Skript-Beispiel**: ReportLab Canvas für Text/PDF
- **Upload**: `gog drive upload &lt;file.pdf&gt; --account [REDACTED_SECRET]`
- **Telegram-Send**: Base64-Buffer für Local-Path-Bypass

## 🛠️ **Memory Search** (updated 2026-02-15)
- **Provider:** OpenAI text-embedding-3-small
- **Behavior:** Mandatory first step for prior work/dates/people/etc. Fallback to direct read/memory_get if results: [] (common for low-match queries).

## 🛠️ **Edit Tool** (neu 15.02.2026)
- **Regel:** oldText MUSS EXAKT matchen (Whitespace, Newlines inkl.!)
- **Routine:** 1. `read path` → oldText 1:1 kopieren → `edit`
- **Fallback:** Bei Error: `read` full → `write` updated file (oder kleinere Chunks)

## 🛠️ **Tool Exec Best Practices** (neu 16.02.2026)
- **Keine parallelen Calls bei Dependencies**: Sequence exec (zuerst open/snapshot → dann act). Errors überschreiben nicht gute Outputs.
- **Error Handling**: Bei Fehlern → retry sequentiell, nicht parallel. Nutze `get text` oder `eval` für sichere Scraping.
  - **Grep mit Apostrophen/Sonderzeichen** (neu 2026-02-25): Verwende `tolower($0) ~ /suchbegriff/i` in awk ODER `grep -iP "(?i).*suchbegriff.*|die millers|we.re the millers"` (PCRE für flexible Matches, . statt '). Vermeide komplexe Regex in single-quotes mit Escaping; teste mit `echo "we're the millers" | grep ...`.

## 🛠️ **Empfehlungen Filme/Serien** (neu 2026-02-17)
- **Prozess**: Bei \"was soll ich gucken/sehen\" FRAGEN IMMER:
  * 1. Trakt: `trakt-cli history --limit 50` (recent)
  * 2. IMDb: `awk` auf `/root/clawd/docs/imdb_ratings.csv` filtern (Title/Genre/Apple TV+ etc.)
  * Exclude: Schon bewertete/gesehene → Top-IMDb-Alternativen vorschlagen
  - **"Gesehen?" Queries** (neu 2026-02-25): IMMER:
    * IMDb-CSV: `awk -F',' 'NR>1 && tolower($0) ~ /suchbegriff/i {print $0}' /root/clawd/docs/imdb_ratings.csv | head -5` (sucht in ALLEN Feldern case-insensitive)
    * Trakt: `trakt-cli history --limit 200 | grep -i suchbegriff || true`
    * **Prozess**: IMMER zuerst IMDb-CSV durchsuchen (alle Felder case-insensitive), falls KEIN Treffer → dann Trakt (recent history).
- **Beispiel Query**: `awk -F',' 'NR>1 && /Apple TV/ {print}' /root/clawd/docs/imdb_ratings.csv

## 🔊 **TTS Voices** (seit 20.02.2026)
- **Primär:** ElevenLabs voiceId: "vl67BWhZHh0QyG35TvXt" (Config in openclaw.json ✅)
- **Fallback:** Edge-TTS de-DE-KillianNeural (nur bei Problemen mit ElevenLabs)
**Source:** User-Anweisung Walter Wego (20.02.2026)

## 🔊 **ElevenLabs Credits** (seit 20.02.2026)
- **Abruf:** `exec` mit `curl -X GET 'https://api.elevenlabs.io/v1/user' -H 'xi-[REDACTED_SECRET]' -H 'accept: application/json'`
- **Parse:** `subscription.character_limit - subscription.character_count` = verbleibend
- **Anzeige:** Nur "**Verbleibend:** X / Y Zeichen (Free Tier, monatlich). 🤓"

## 💰 **OpenClaw Cost-Tracker** (seit 21.02.2026)
- **Skill:** `~/openclaw/skills/openclaw-cost-tracker` (python3 scripts/cost_tracker.py)
- **Verwendung:** Bei allen Kostenfragen (Kosten/costs/token spend) diesen Skill priorisieren - parsed JSONL für USD/Tokens pro Model/Tag.
**Source:** User-Anweisung Walter Wego (21.02.2026)
**Source:** User-Anweisung Walter Wego (20.02.2026)


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)