====== SonosFIFO 4.0 – Zentrale Sonos-Sprachansagen ====== ===== Überblick ===== SonosFIFO verwaltet MP3-Sprachansagen in ioBroker zentral. Die Automationen (z. B. Blockly) lösen lediglich einen Profilnamen aus. Die Verwaltung kümmert sich um Lautsprecher, MP3, Lautstärke, optionale Ankündigung, Priorität, Nachtmodus und Warteschlange. * **Priorität:** Alarm > Warnung > Info. Bei gleicher Priorität gilt die Eingangsreihenfolge (FIFO). * **Keine Unterbrechung:** Eine laufende Ansage inklusive Ankündigungston wird vollständig zu Ende gespielt. * **Nachtmodus:** Info, Warnung und nicht freigegebene Alarme bleiben stumm. Ausschließlich entsprechend konfigurierte kritische Alarmprofile dürfen nachts spielen. * **Warteschlange:** Aufträge werden vor der Annahmebestätigung dauerhaft in ioBroker gespeichert. * **Bedienung:** Per Profil-Taster im Objektbaum oder per Blockly-Nachricht. Schnelle doppelte Tastendrücke werden entprellt. * **Zentrale Profile:** Neue Sprachansagen werden ausschließlich im separaten Profilskript eingetragen. ===== System und Speicherorte ===== ^ Komponente ^ Konfiguration / Speicherort ^ | ioBroker | JavaScript-Adapter ''javascript.0'' | | Sonos-HTTP-API | ''http://192.168.10.11:5005'' | | Sonos-HTTP-API Dienst | ''sonosapi.service'' | | Installationsverzeichnis der API | ''/home/iobroker/node-sonos-http-api-current/'' | | **Zentrale MP3-Ablage (ioBroker-Upload)** | ''/opt/iobroker/iobroker-data/files/0_userdata.0/clips/'' | | **Symbolischer Link der Sonos-API** | ''/home/iobroker/node-sonos-http-api-current/static/clips'' | | Alle Zustände | ''0_userdata.0.Sprachansagen'' | **Wichtig: Der ioBroker-Ordner ist der einzige MP3-Speicherort.** Neue MP3-Dateien über die ioBroker-Oberfläche nach ''0_userdata.0 / clips'' hochladen. Nicht zusätzlich in das Sonos-Installationsverzeichnis kopieren. Der folgende symbolische Link verbindet beide Systeme: /home/iobroker/node-sonos-http-api-current/static/clips -> /opt/iobroker/iobroker-data/files/0_userdata.0/clips Link und Webzugriff prüfen: ls -ld /home/iobroker/node-sonos-http-api-current/static/clips readlink -f /home/iobroker/node-sonos-http-api-current/static/clips curl -I http://127.0.0.1:5005/clips/gong.mp3 sudo systemctl status sonosapi --no-pager Erwartet: ''readlink -f'' zeigt den ioBroker-MP3-Ordner; der HTTP-Aufruf liefert ''200 OK''. **Neuinstallation des Links (nur falls noch nicht vorhanden):** Das vorhandene Verzeichnis vorher sichern und sicherstellen, dass die MP3-Dateien im ioBroker-Ordner liegen. Niemals ein befülltes ''static/clips'' blind löschen oder überschreiben. SRC=/opt/iobroker/iobroker-data/files/0_userdata.0/clips DST=/home/iobroker/node-sonos-http-api-current/static/clips # Nur ausführen, wenn DST kein existierendes Verzeichnis/Link mehr ist: sudo ln -s "$SRC" "$DST" ===== Installation und Inbetriebnahme ===== ==== Voraussetzung ==== * Sonos-HTTP-API läuft auf Port 5005, Sonos-Zone ''Flur'' ist erreichbar. * Die Dateien ''gong.mp3'', ''waschmaschine_fertig.mp3'', ''Windalarm.mp3'' und ''Wasseralarm_HWR.mp3'' liegen im zentralen ioBroker-Clip-Ordner. * Im JavaScript-Adapter kann auf diesen Ordner lesend zugegriffen werden. * Es darf **nur ein** SonosFIFO-Controller aktiv sein. Bestehende direkte ''/clip/''-Aufrufe können sonst die Wiedergabe überlagern. ==== Die zwei Skripte ==== ^ ioBroker-Skript ^ Inhalt ^ | ''script.js.common.SonosFIFO_Profile'' | Datei ''SonosFIFO_Profile.js''; Kategorien und sämtliche MP3-Profile. | | ''script.js.common.SonosFIFO'' | Datei ''SonosFIFO_Controller.js''; Wiedergabe, Prioritäten, Nachtmodus, Status, Persistenz und Buttons. | - In ioBroker unter **Skripte** die zwei JavaScript-Skripte anlegen (bzw. bestehende Skripte aktualisieren). - **Zuerst** das Profilskript aktivieren. Log: ''[SonosFIFO Profile] 4 Profile veroeffentlicht''. - **Danach** den Controller aktivieren. Log: ''[SonosFIFO] Profile geladen: 4'' und ''[SonosFIFO] v4.0 bereit''. - Unter ''0_userdata.0.Sprachansagen.Status'' müssen ''Konfigurationsfehler'' und ''LetzterFehler'' leer sein. Der Nachtmodus muss einen plausiblen Wert zeigen. - Unter ''0_userdata.0.Sprachansagen.Ausloeser'' erscheinen die Profil-Taster ''WaschmaschineFertig'', ''Gong'', ''Windalarm'' und ''WasseralarmHWR''. ==== Aktualisierung einer bestehenden Installation ==== - Laufende Ansage beenden lassen. Vor dem Update sollten ''Status.Beschaeftigt=false'' und ''Status.WartendGesamt=0'' gelten. - Die beiden bisherigen Skripte sowie ''Intern.SpeicherJSON'' sichern/exportieren. - Bestehenden Controller stoppen; **keine zweite Controller-Instanz** anlegen. - Vorhandenes Profilskript mit ''SonosFIFO_Profile.js'' aktualisieren, starten und Veröffentlichung im Log prüfen. - Vorhandenen Controller mit ''SonosFIFO_Controller.js'' aktualisieren und starten. - Einstellungen und Warteschlangen-Speicher werden beibehalten; bei Bedarf gespeicherte Werte unter ''Einstellungen'' kontrollieren. - Umbenannte/entfernte Profile können alte Auslöser-Datenpunkte hinterlassen. Diese werden nicht mehr abonniert und dürfen **nach Kontrolle** manuell aus dem Objektbaum entfernt werden. Der Controller löscht niemals automatisch fremde Datenpunkte. Das interne Speicherformat wird bewusst beibehalten, damit die Warteschlange beim Controller-Austausch nicht zurückgesetzt wird. ''Intern.SpeicherJSON'' nicht löschen oder manuell bearbeiten. ===== Profile pflegen ===== **Einzige Konfigurationsquelle:** ''SonosFIFO_Profile.js''. Änderungen in den Objekten ''Konfiguration.ProfileJSON'' sind nicht der richtige Weg: Das Profilskript überschreibt diese beim nächsten Start. ==== Standardwerte je Kategorie ==== const KATEGORIEN = { Info: { raum: 'Flur', lautstaerke: 70, gong: true, gongLautstaerke: 55 }, Warnung: { raum: 'Flur', lautstaerke: 85, gong: true, gongLautstaerke: 70 }, Alarm: { raum: 'Flur', lautstaerke: 95, gong: false, gongLautstaerke: 70 } }; ==== Profil-Beispiele der ausgelieferten Konfiguration ==== ^ Profilname ^ Kategorie ^ MP3 ^ Nachtfreigabe ^ | ''WaschmaschineFertig'' | Info | ''waschmaschine_fertig.mp3'' | Nein | | ''Gong'' | Info | ''gong.mp3'' | Nein | | ''Windalarm'' | Warnung | ''Windalarm.mp3'' | Nein | | ''WasseralarmHWR'' | Alarm | ''Wasseralarm_HWR.mp3'' | **Ja (kritischer Alarm)** | ''WasseralarmHWR'' ist bewusst nachts freigegeben. Falls dieser Alarm nachts **nicht** spielen soll, im Profilskript ''nachtsErlaubt: false'' setzen. Die Alarm-Kategorie allein erteilt keine Nachtfreigabe. Neues Profil hinzufügen: TrocknerFertig: { prioritaet: 'Info', datei: 'trockner_fertig.mp3', lautstaerke: 75, gong: true }, - MP3 über ioBroker hochladen; exakt auf Groß-/Kleinschreibung achten. - Profil in ''PROFILE'' ergänzen. Erlaubt sind Profilnamen mit Buchstabe am Anfang, danach nur Buchstaben A–Z, Ziffern und Unterstriche. - Zulässige Profilparameter: ''prioritaet'' (Info/Warnung/Alarm), ''datei'', optional ''raum'', ''lautstaerke'' (0–100), ''gong'' (wahr/falsch), ''gongLautstaerke'' (0–100), ''ankuendigungDatei'' (MP3 nur für dieses Profil), ''nachtsErlaubt'' (ausschließlich bei Alarm relevant). - Profilskript neu starten. Der Controller übernimmt die Konfiguration automatisch und erstellt den passenden Taster. **Kein Controller-Neustart nötig.** ===== Ankündigungstöne ===== Der Profilparameter ''gong: true'' bedeutet: Vor der eigentlichen Sprachansage einen Ankündigungston spielen. **Dieser Ton muss nicht ''gong.mp3'' heißen.** ^ Einstellung unter ''0_userdata.0.Sprachansagen.Einstellungen'' ^ Standarddatei ^ Verwendung ^ | ''AnkuendigungInfo'' | ''gong.mp3'' | Ankündigung für Info-Profile | | ''AnkuendigungWarnung'' | ''gong.mp3'' | Ankündigung für Warnungsprofile | | ''AnkuendigungAlarm'' | ''gong.mp3'' | Ankündigung für Alarmprofile (sofern dort ''gong: true'') | Beispiel: ''AnkuendigungWarnung = warnung.mp3''. Die Datei muss vorher im ioBroker-Clip-Ordner liegen. Ein Profil kann mit dem Parameter ''ankuendigungDatei'' (z. B. ''sonderton.mp3'') eine abweichende MP3 auswählen. Die Ankündigungslautstärke ist separat einstellbar. ===== Ansagen auslösen ===== ==== 1. Profil-Taster im ioBroker-Objektbaum ==== Datenpunkt ''0_userdata.0.Sprachansagen.Ausloeser.'' auf ''true'' setzen. Der Controller stellt ihn automatisch auf ''false'' zurück. Eingehende Tastendrücke werden unabhängig von ihrem ACK-Flag erkannt. Um versehentliche Doppelklicks zu vermeiden, werden weitere Tastendrücke **desselben Profils** innerhalb von ''Einstellungen.TasterSperreMs'' (Standard 1500 ms) ignoriert. Jeder zulässige Tastendruck führt zu einem neuen Auftrag, auch wenn bereits eine Ansage läuft. ==== 2. Blockly: empfohlene Ansteuerung ==== Blockly-Block **„Nachricht an anderes Skript“**: * JavaScript-Instanz: ''javascript.0'' * Skript: ''script.js.common.SonosFIFO'' * Nachrichtenname: ''ansage'' * Daten: Text ''WaschmaschineFertig'' Individuelle Lautstärken, ohne das Profil zu verändern: * ''WaschmaschineFertig|75'' → Ansage mit 75 % * ''WaschmaschineFertig|75|45'' → Ansage 75 %, Ankündigung 45 % Die Antwort auf ''messageTo'' (optional „Mit Ergebnissen“) meldet, ob ein Auftrag **dauerhaft angenommen** oder z. B. wegen Nachtmodus verworfen wurde. Sie meldet **nicht**, dass die MP3 bereits zu Ende abgespielt wurde. ==== 3. Weitere Schnittstellen ==== * ''Eingang.Profil'': einen Profilnamen oder ein ''Profil|Lautstärke|Gonglautstärke''-Kommando schreiben. * ''Eingang.AnfrageJSON'': Parameterobjekt als JSON schreiben, z. B. ''{"profil":"WaschmaschineFertig","lautstaerke":75}''. * Direkte ''messageTo''-Parameterobjekte sind ebenfalls möglich, z. B. ''{profil:'WaschmaschineFertig', lautstaerke:75, raum:'Flur'}''. Für sicherheitskritische Automationen **messageTo mit Rückmeldung verwenden**, nicht einen kurzen Tasterimpuls. Anfragen, die während eines Controller-Ausfalls gar nicht ankommen, können nicht gespeichert werden. Doppelte Alarmierung über einen unabhängigen Weg empfohlen. ===== Priorität und Nachtmodus ===== * Die jeweils laufende Ansage wird **niemals unterbrochen**; nach ihrem Ende entscheidet ''Alarm > Warnung > Info'' über die nächste. Innerhalb derselben Kategorie bleibt die Reihenfolge erhalten. * ''Einstellungen.NachtmodusQuelle'' enthält die Quell-Datenpunkt-ID, standardmäßig ''knx.0.Zentral.Tag=0___Nacht=1.Tag=0___Nacht=1_Schlafzimmer''. * Bei der Quelle gilt ''0 = Tag'' und ''1 = Nacht''; auch boolesche Werte werden erkannt. * **Nachts** werden Info-, Warnungs- und nicht ausdrücklich freigegebene Alarmaufträge beim Eingang unterdrückt; bereits wartende unzulässige Aufträge werden beim Nachtwechsel verworfen, **nicht** morgens nachgeholt. * Eine schon laufende Ansage darf zu Ende spielen. Nur als kritisch konfigurierte Alarmprofile (''nachtsErlaubt: true'') dürfen nachts abgespielt werden. * Ist der Nachtstatus unbekannt/ungültig, wird vorsichtshalber Nacht angenommen. * ''Einstellungen.NachtmodusTest = true'' **erzwingt Nacht zu Testzwecken**; ''false'' aktiviert wieder die echte Quelle. Diese Einstellung niemals versehentlich aktiviert lassen. ===== Datenpunkte – Übersicht ===== Alle folgenden Namen liegen unter ''0_userdata.0.Sprachansagen''. ==== Ausloeser / Eingang / Konfiguration ==== ^ Gruppe ^ Datenpunkte ^ Zweck ^ | ''Ausloeser'' | '''' | Automatisch erzeugte Profil-Taster (boolean); einmal auf ''true'' setzen | | ''Eingang'' | ''Profil'', ''AnfrageJSON'' | Alternative Eingänge für Texte bzw. JSON-Aufträge | | ''Konfiguration'' | ''ProfileJSON'' | Durch Profilskript veröffentlichte Konfiguration; nicht manuell bearbeiten | ==== Steuerung ==== ^ Datenpunkt ^ Funktion ^ | ''Pausiert'' | ''true'': nach laufender Ansage keine weiteren Aufträge starten; ''false'': fortsetzen | | ''WarteschlangeLeeren'' | Alle **wartenden** Aufträge entfernen; laufende Wiedergabe beenden lassen | | ''FehlerQuittieren'' | Fehlerzustand aufheben; ein möglicherweise nicht vollständig gespielter aktiver Auftrag startet von vorne | ==== Einstellungen ==== ^ Datenpunkt ^ Bedeutung ^ | ''AnkuendigungInfo'' / ''AnkuendigungWarnung'' / ''AnkuendigungAlarm'' | MP3 für die jeweilige Kategorie, Standard ''gong.mp3'' | | ''TasterSperreMs'' | Entprellung der Profil-Taster, Standard ''1500'' ms (0–10000) | | ''GongPauseMs'' | Pause zwischen Ankündigung und Ansage, Standard ''1000'' ms | | ''ZwischenAuftraegenMs'' | Abstand zwischen Aufträgen, Standard ''800'' ms | | ''HTTPTimeoutMs'' | HTTP-Timeout pro Sonos-Clip, Standard ''90000'' ms | | ''NachtmodusQuelle'' | Quell-Datenpunkt-ID für Tag/Nacht | | ''NachtmodusTest'' | ''true'' = Nacht erzwingen; ''false'' = echten Zustand lesen | ==== Status ==== ^ Datenpunkte ^ Bedeutung ^ | ''Zustand'', ''Beschaeftigt'', ''Phase'' | Bereitschaft, Fehler/Pause und Fortschritt der aktiven Ansage | | ''Profil'', ''Datei'', ''Raum'', ''Prioritaet'' | Aktuell bearbeiteter Auftrag | | ''WartendGesamt'', ''WartendAlarm'', ''WartendWarnung'', ''WartendInfo'' | Anzahl wartender Aufträge, jeweils ohne aktiven Auftrag | | ''WarteschlangeJSON'' | Nach Priorität sortierte, vorgesehene Reihenfolge | | ''ProfileJSON'' | Effektiv aufgelöste Profile (inkl. Kategorie-Standardwerte) | | ''Konfigurationsfehler'', ''LetzterFehler'' | Fehler bei Profilübernahme beziehungsweise Wiedergabe/Speicherung | | ''LetzteAnsage'', ''LetzteAnsageZeit'' | Letzte abgeschlossene Ansage | | ''Nachtmodus'', ''NachtsperreAktiv'', ''NachtmodusQuelle'' | Nachtzustand und verwendete Quelle | | ''NachtsUnterdrueckt'', ''LetzteUnterdrueckung'' | Statistik verworfener Aufträge | | ''LetzterTaster'', ''TasterIgnoriert'' | Bedienung und Doppelklick-Entprellung | ==== Intern ==== ''Intern.SpeicherJSON'' enthält die dauerhaft gespeicherte Warteschlange einschließlich ggf. aktivem Auftrag, Pause-/Fehlerstatus und Zählern. **Nicht manuell ändern oder löschen.** ===== Bedienung und Wartung ===== * **MP3 hinzufügen:** Über ioBroker nach ''0_userdata.0 / clips'' hochladen; Dateinamen exakt in Profil eintragen. * **Profil ändern/anlegen:** Nur ''SonosFIFO_Profile'' bearbeiten und neu starten. * **Ankündigung für eine Kategorie wechseln:** Entsprechenden Datenpunkt unter ''Einstellungen'' ändern; keine Skriptänderung nötig. * **Warteschlange stoppen:** ''Steuerung.Pausiert = true''; laufende Ansage wird noch beendet. * **Warteschlange leeren:** ''Steuerung.WarteschlangeLeeren = true''; nur wartende Aufträge werden entfernt. * **Wiedergabefehler:** ''Status.LetzterFehler'' und Sonos-API prüfen, danach ''Steuerung.FehlerQuittieren'' auslösen. * **Kontrolle:** ''Status.WarteschlangeJSON'', ''Status.WartendGesamt'' und die ioBroker-Logmeldungen verwenden. * **Nach Sonos-API-Update:** Symbolischen Link und HTTP-Abruf erneut prüfen. * **Sicherung:** Beide Skripte und den Datenpunkt ''Intern.SpeicherJSON'' sichern. ioBroker-/Proxmox-Backup einschließen. ===== Kurzer Funktionstest ===== **Achtung:** Je nach Profil können Warnungen/Alarme laut abgespielt werden (Kategorie-Standards 85/95 %). Zu Testzwecken kann aus Blockly vorübergehend eine niedrigere Lautstärke übergeben werden, z. B. ''Windalarm|35''. - ''Status.Konfigurationsfehler'' und ''Status.LetzterFehler'' müssen leer sein; ''Steuerung.Pausiert=false'', Nachtstatus beachten. - ''Ausloeser.Gong'' auf ''true'' setzen. Erwartung: ''gong.mp3'' auf ''Flur'', automatische Rückstellung auf ''false''. - Für Priorität: tagsüber ''Steuerung.Pausiert=true'', anschließend per Blockly ''WaschmaschineFertig'', ''Windalarm'' und ''WasseralarmHWR'' einreihen. ''WarteschlangeJSON'' muss Alarm vor Warnung vor Info anzeigen. - ''Steuerung.Pausiert=false'': Alle Aufträge werden in Prioritätsreihenfolge vollständig abgearbeitet. - Für Nacht: ''Einstellungen.NachtmodusTest=true'' (nur bewusst zum Testen!). Info/Warnung werden unterdrückt; ''WasseralarmHWR'' ist freigegeben. Danach ''NachtmodusTest=false''. - Zum Schluss ''Status.WartendGesamt=0'' und ''Status.Zustand=Bereit'' kontrollieren. ===== Sicherheits- und Zuverlässigkeitshinweise ===== * **Speicherung:** Ein angenommener Auftrag wird vor der Bestätigung gespeichert. Nach unerwartetem Neustart können offene Aufträge erneut abgespielt werden; eine Doppelansage ist möglich. * **Ausfall des Controllers:** Nicht zugestellte Taster-/Blockly-Auslöser während des Ausfalls können nicht nachträglich rekonstruiert werden. Für kritische Alarmmeldungen zusätzliche unabhängige Alarmwege vorsehen. * **Nachtmodus:** Absichtlich unterdrückte Aufträge werden verworfen und nicht nachträglich abgespielt. * **Sonos-Wiedergabe:** Nicht parallel an denselben Lautsprechern direkte Sonos-''clip''-Aufrufe oder einen zweiten FIFO-Controller verwenden. * **Absturz-Wiederanlauf:** Nach einem vorzeitig beendeten aktiven Auftrag wartet der Controller 30 Sekunden und reiht den Auftrag erneut ein; vor erneuter Wiedergabe auf Sonos-Status achten. * **Sicherheit:** Sonos-Sprachansagen ersetzen weder eine Sirene noch Alarmmeldungen per Handy für sicherheitskritische Ereignisse.