Sonos Modul

Nur so am Rande wenn man jetzt Sonos über die Sonos App auf die neuste Version aktualisiert lässt sich auch Alexa mit Sonos nutzten.

…aber nur, wenn man an der öffentlichen Beta von Sonos teilnimmt! Weil das ist noch nicht „final“ oder „stable“!
>> heise // Vernetzte Lautsprecher: Sonos startet öffentliche Alexa-Beta und präsentiert neuen Lautsprecher

Keine Ahnung, ob es an meinem Skill liegt oder am Beta-Status, bei mir funktioniert quasi nichts mit Alexa und Sonos über den Sonos-Skill :rolleyes:

>> Mehr erfreut mich dieser Punkt in der Quelle >> Anfang 2018 öffnet Sonos sein API für alle.

Grüße,
Chris

Da bin ich mal sehr gespannt was das heißt und vor allem was das bedeutet zertifiziert zu werden. Da stellen sich manche Firmen ja an. Dann darf man sich also „Works with Sonos“ nennen. Das kann ich mir jetzt auch schon auf meinen Raspberry mit IPS mit einem selbstgedruckten Aufkleber :rolleyes: kleben :loveips:, und das geht schon seit Jahren auch ohne API. Aber vielleicht ist ja dann vieles endlich mal einfacher und vor allem sauber vom Hersteller dokumentiert.

Keine Ahnung, ob es an meinem Skill liegt oder am Beta-Status, bei mir funktioniert quasi nichts mit Alexa und Sonos über den Sonos-Skill

Also es ist nicht der kracher, aber Sonos lässt sich bei mir mit Alexa bedienen. Laut, leise, Radiostationen im Raum starten usw.

Alexa mit Sonos Skill funktioniert bei mir auch ganz ordentlich.
Nettes Feature…

Gesendet von iPhone mit Tapatalk

Kennt ihr den neuen Sonos One? Soll ein Play1 mit integriertem Alexa sein und Ende Oktober erscheinen. vereinfacht das dann den Ablauf bzw die Skripte?

Gruß oekomat

Nö, warum sollte es was an den Skripten oder Ablauf ändern? Weil ein Mikro im Speaker eingebaut ist?
Peter

Gesendet von iPhone mit Tapatalk

Der Speaker hat doch nur eine IP, im Gegensatz zu dot und play1. Die haben ja dann schon 2 IPs. Dachte, dass würde irgendwas ändern.

Momentan wird ja Google home noch nicht supported. Was auch abzuwarten bleibt.

Könnt ihr die Speaker gruppieren per Alexa bzw Gruppen auflösen? Vielleicht spreche ich zu undeutlich bzw weiss nicht, was ich sagen soll :slight_smile:

Ne geht einfach nicht.

Siehe Steuerung von Sonos mit Amazon Alexa

Zurzeit nicht unterstützt

[ul]
[li]Gruppieren Räume
[/li][/ul]

Ok Danke. Hab heute morgen nur paar Minuten zum testen gehabt.

Danke für die Antwort!

Ein Problem ist, dass eine Durchsage die Wiedergabe beendet. Das Sonosmodul bekommt die Wiedergabe nicht korrekt mit und fällt dann nicht in die vorhergehende Wiedegabe zurück sondern in stop.
Ähnlich dem Spotify Connect verhalten.

Gibts da eine Lösung?

Sebastian

Hallo an Alle,
erst einmal vielen Dank an T. Kugelberg für seine weitere Arbeit am Sonos Modul von Paresy, ich bin hier noch blutiger Anfänger und verstehe an vielen stellen wirklich komplett nur BAHNHOF, aber das Modul nutzen bekomme ich tatsächlich hin:).
Ist ja auch mit den paar Befehlen auch super einfach!

Ich hoffe ich bin mit meiner Frage nicht völlig falsch hier und zwar steuere ich z.B. meine elektrische Fußbodentemperierung über den Sonoswecker. Es gibt bei mir morgens bis zu 4 verschiedene Weckzeiten in der Woche, je nach dem wo ich beruflich hin muss. Bei Sonos setze ich nur den „Haken“ um und ändere vielleicht noch die Playlist oder den Sender.
Meine Playlist sind alle aus Amazon Musik. Das geht in der Sonos App einfach komfortabler.

Bis gestern meine Auslesescript wunderbar funktioniert.
Ich habe einfach http://IP-Player:1400/status/alarm abgefragt und die zurückkommenden Textzeilen nach „Nextlocal“ durchsucht
und die gefunden Datum/Uhrzeiten in Unix Time umgewandelt und in ein Array geschrieben
Diese kurz aufsteigen sortiert und schon hatte ich die nächste Weckzeit und konnte meine E-Fußbodentemperierung z.B. 2 Std. vorher starten, dies habe ich auch mit den normalen Heizungen in Bad, Küche usw. gemacht. So war inkl. Wochenende die Heizungen entsprechen gesteuert.

Ich suche händeringend nach eine neuen Lösung, da nach dem Update auf Sonos 8.0 die Seite status/alarm nicht mehr existiert.

Besteht da eine Möglichkeit diese Informationen über das Sonos-Modul zu bekommen?
Es reicht auch wirklich die komplette Liste der eingeschalteten Alarme in einem String. (zerlegen kann ich jetzt ja schon :D)

Sitze jetzt schon seid heute morgen an diesem Problem und habe noch nicht einmal eine geringfügigen Ansatz.

Würde mich freuen wenn ihr ein Herz für einen Programmierer-Dau hättet.

Ja, ich könnte per Wochenprogramm-Tageweise eine ähnliche Lösung bauen, wir aber alleine in IPS APP schon nicht so schön zu bedienen, vor allem bei Wechsel der Playlist oder Sender. Auch im WEB-Modul bin ich noch als DAU zu bezeichnen.

Vor allem gibt es da auch noch den WAF-Faktor und der kommt mit der Sonos App super klar und die Anzeige wann geweckt wird in der IPS APP reicht ihr völlig.

Gruß Achim

Da habe ich mir ein Modul (TS_SonosAlarm, enthalten in git://icy.my-router.de/Ts_Module) gebaut, für meine Dinge.

Aber das Skript kannst du gerne auf deine Anlage umbauen :


<? 
$SonosId = IPS_GetProperty(IPS_GetParent($_IPS["SELF"]), "Sonos_ID");
$ip = IPS_GetProperty($SonosId, "IPAddress");

$pfad = IPS_GetProperty(IPS_GetParent($_IPS["SELF"]), "Pfad");
if (Sys_Ping($ip, 1000) == true) {
include_once("../modules/SymconSonos/Sonos/sonosAccess.php");
$sonos = new SonosAccess($ip); //Sonos ZP IPAdresse
$alarmvol = IPS_GetProperty(IPS_GetParent($_IPS["SELF"]), "AlarmVolume");
$alarmdatei = IPS_GetProperty(IPS_GetParent($_IPS["SELF"]), "Alarm1");

///$ton="alarm";
/*
$wav = array
(
// x-file-cifs://192.168.1.11/nas/
   "alarm"   => "x-file-cifs://".$pfad.$alarmdatei,
   "bell"    => "x-file-cifs://".$pfad."alarm-sirene.mp3"
);
*/
$wav = "x-file-cifs://".$pfad.$alarmdatei;
$volume = $sonos->GetVolume();

//Speichern der Aktuellen Informationen
$oldpi = $sonos->GetPositionInfo();
$oldmi = $sonos->GetMediaInfo();
$radio=(strpos($oldmi["CurrentURI"],"x-sonosapi-stream:")>0)===false;
$oldti = $sonos->GetTransportInfo();

$sonos->SetVolume($alarmvol);
//$sonos->SetAVTransportURI($wav[$ton]);
$sonos->SetAVTransportURI($wav);
$sonos->Play();

IPS_Sleep(1000);
while ($sonos->GetTransportInfo()==1)
{
    IPS_Sleep(200); //Alle 200ms wird abgefragt
}
//Player wieder Starten
if ($radio)
{
    $sonos->SetRadio($oldmi["CurrentURI"]);
}
else
{
    $sonos->SetAVTransportURI($oldmi["CurrentUR"],$oldmi["CurrentURIMetaData"]);
}
try
{
    // Seek TRack_Nr
   $sonos->Seek("TRACK_NR",$oldpi["Track"]);
   // Seek REl_time
   $sonos->Seek("REL_TIME",$oldpi["RelTime"]);
}
catch (Exception $e)
{
}
if ($oldti==1) $sonos->Play();
$sonos->SetVolume($volume);
}
?>

Das war meine Aufgabenstellung schon bevor es das Sonos-Modul von Thorsten gab und dabei ist das hier entstanden und funktioniert bis heute einwandfrei (bis auf Text2Speech über Google, das funktioniert glaube ich so nicht mehr):
SonosBY (Sonos // Gruppen erstellen, Gruppen auflösen, Text to Speech, …)

Beachte nur den Hinweis >> Beim Gruppen-Master wird der alte Zustand nicht wiederhergestellt! Gilt auch für den Master, wenn ihr nur bestimmte Player zu einer Gruppe zusammenfasst, oder mit „SonosBY_***_Auswahl“ nur auf einem Raum etwas abspielen lasst!
…mein Master ist deshalb immer die Sonos im Flur, weil ich die quasi nie verwende und nur für Sprachausgaben verwendet wird, daher ist es mir dort egal mit dem Wiederherstellen des alten Stand.

Evtl. reichen dir aber auch schon die im Script enthaltenen Funktionen:
> SonosBY_AltenZustandLesen
> SonosBY_AltenZustandSetzen

Grüße,
Chris

Guten Morgen,

das Modul nutze ich unter anderem, um die Klingel in weitere Räume „umzuleiten“. Dazu nutze ich den Befehl SNS_PlayFiles, also bei 3 Räumen z.B.

SNS_PlayFiles...;
SNS_PlayFiles...;
SNS_PlayFiles...;

Allerdings wartet das Skript immer, bis die jeweilige Wiedergabe des Klingel-MP3-Files beendet ist, bevor es den nächsten SNS_PlayFiles-Befehl ausführt, d.h. der „Klingelton“ wird nicht parallel, sondern hintereinander wiedergegeben. Dies führt dazu, dass für das Klingeln im 3. Raum viel Zeit vergeht und derjenige, der geklingelt hat, ggf. schon gar nicht mehr da ist (etwa bei den Paketboten kann es ja nie schnell genug gehen…).

Gibt es eine Möglichkeit, den „Klingelton“ parallel wiedergeben lassen kann? Wie bekommen ich das Skript also dazu, den SNS_PlayFiles-Befehl nur abzusetzen und nicht abzuwarten, bis die File-Wiedergabe beendet ist?

Danke und viele Grüße, Götz

Du kannst ja mal probieren die Befehle nicht in ein Skript zu schreiben, sondern für jeden Raum mit einem Sonos ein separates Skript anzulegen mit dem SNS_PlayFiles Befehl. Das Skript, das aufgerufen wird wenn es klingelt, startet dann die weiteren Skripte mit IPS_RunScript, dann werden die drei Skripte der jeweiligen Räume parallel ausgeführt.

Das scheint in der Tat zu funktionieren, danke Fonzo! Allerdings hat man da bei 2 unterschiedlichen Klingeltönen natürlich eine ganze Reihe Skripte. Aber der Zweck heiligt die Mittel…

VG, Götz

Hallo Götz,
ich hab es so gelöst:

Ein übergeordnetes Script zum Aufruf:

<?
IPS_LogMessage($_IPS['SELF'],"Alarm_Main - gestartet");

$AlarmVariable = $_IPS['VARIABLE']; // Alarm auslösende Variable 
IPS_LogMessage($_IPS['SELF'],"Alarm_Main - VARIABLE : ".$AlarmVariable);

//$AlarmParentID = IPS_GetObject($AlarmVariable)['ParentID']; // Alarm auslösende Variable - ParentID
//IPS_LogMessage($_IPS['SELF'],"Alarm_Main - AlarmParentID : ".$AlarmParentID);

//$AlarmParentName = IPS_GetName($AlarmParentID);  // Alarm auslösende Variable - ParentName
//IPS_LogMessage($_IPS['SELF'],"Alarm_Main - AlarmParentName : ".$AlarmParentName);

$SMTP_ID = 16754 /*[Alarmierung\smarthome@xxx.de]*/;

switch ($AlarmVariable)
{
   	case 12436 /*[Wago\Global\Klingel\Klingel_Gartentuer\Value]*/:
		IPS_LogMessage($_IPS['SELF'],"Alarm_Main - Klingeln an der Gartentür");
		SMTP_SendMail($SMTP_ID, "IPS - Klingeln an der Gartentür", "Klingeln an der Gartentür");
		IPS_RunScriptEx(50904 /*[Alarmierung\Alarm_Kodi]*/, Array("Kodi_Message" => "Gartentuer"));
		IPS_RunScriptEx(14921 /*[Alarmierung\Alarm_Sonos]*/, Array("Sonos_Message" => "Gartentuer"));
       	break;
   	case 11305 /*[Wago\Global\Klingel\Klingel_Haustuer1\Value]*/:
		IPS_LogMessage($_IPS['SELF'],"Alarm_Main - Klingeln an der Haustür");
		SMTP_SendMail($SMTP_ID, "IPS - Klingeln an der Haustür", "Klingeln an der Haustür");
		IPS_RunScriptEx(50904 /*[Alarmierung\Alarm_Kodi]*/, Array("Kodi_Message" => "Haustuer"));
		IPS_RunScriptEx(14921 /*[Alarmierung\Alarm_Sonos]*/, Array("Sonos_Message" => "Haustuer"));	
       	break;
   	case 31666 /*[Wago\Global\Klingel\Klingel_Haustuer2\Value]*/:
		IPS_LogMessage($_IPS['SELF'],"Alarm_Main - Klingeln an der Haustür");
		SMTP_SendMail($SMTP_ID, "IPS - Klingeln an der Haustür", "Klingeln an der Haustür");
		IPS_RunScriptEx(50904 /*[Alarmierung\Alarm_Kodi]*/, Array("Kodi_Message" => "Haustuer"));
		IPS_RunScriptEx(14921 /*[Alarmierung\Alarm_Sonos]*/, Array("Sonos_Message" => "Haustuer"));	
       	break;
	default:
		IPS_LogMessage($_IPS['SELF'],"Alarm_Main - Nicht zugeordneter Alarm");
		SMTP_SendMail($SMTP_ID, "IPS - Alarm", "Nicht zugeordneter Alarm");
}
?>

Und hier das Sonos Script.

<?
IPS_LogMessage($_IPS['SELF'],"Alarm_Sonos - gestartet");
IPS_LogMessage($_IPS['SELF'],"Alarm_Sonos - SENDER : ".$_IPS['SENDER']);

$Volume = 60; // Laustärke
$Klingelsound_ID = 15833 /*[Alarmierung\Klingelsound]*/;
$Wiederholung = false;

if($_IPS['SENDER'] <> "Execute")
{
	@IPS_SemaphoreLeave("Sonos");
}

if($_IPS['SENDER'] <> "TimerEvent")
{
	if (IPS_SemaphoreEnter("Sonos", 1000))
	{
		// Zuweisen der Sounds
		switch ($_IPS['Sonos_Message'])
		{
	    	case "Gartentuer":
				SetValueString($Klingelsound_ID ,"//gamma/sound/Gartentuer.mp3");
				$Wiederholung = true;
	        	break;
	    	case "Haustuer":
				SetValueString($Klingelsound_ID ,"//gamma/sound/Haustuer.mp3");
				$Wiederholung = true;
	        	break;
			default:
				SetValueString($Klingelsound_ID ,"//gamma/sound/Undefiniert.mp3");	
		}

		// Sonos-Sound abspielen
		$Klingelsound = GetValueString($Klingelsound_ID);	
		IPS_LogMessage($_IPS['SELF'],"Alarm_Sonos - Sound: ".$Klingelsound);
		
		SNS_PlayFilesGrouping(18823 /*[Multimedia\EG\EZ\EG_EZ_Sonos]*/
	 						  ,array(17252 /*[Multimedia\OG\EZ\OG_EZ_Sonos]*/ => array("volume" => $Volume)
							  ,16591 /*[Multimedia\EG\Bad\EG_Bad_Sonos]*/ => array("volume" => $Volume))
							  ,array($Klingelsound), $Volume);

		IPS_Sleep(1000);
		
		// Timer anschalten
		if ($Wiederholung)
		{
			IPS_SetScriptTimer($_IPS['SELF'], 5);
		}	
		IPS_SemaphoreLeave("Sonos");
	}
	else
	{
		IPS_LogMessage($_IPS['SELF'],"Sonos durch Semaphore gesperrt");
	}																
}
else
{
	if (IPS_SemaphoreEnter("Sonos", 1000))
	{
		// Timer ausschalten
    	IPS_SetScriptTimer($_IPS['SELF'], 0);	

		// Sound abspielen
		$Klingelsound = GetValueString($Klingelsound_ID);
		IPS_LogMessage($_IPS['SELF'],"Alarm_Sonos - Sound: ".$Klingelsound);

		SNS_PlayFilesGrouping(18823 /*[Multimedia\EG\EZ\EG_EZ_Sonos]*/
 							  ,array(17252 /*[Multimedia\OG\EZ\OG_EZ_Sonos]*/ => array("volume" => $Volume)
							  ,16591 /*[Multimedia\EG\Bad\EG_Bad_Sonos]*/ => array("volume" => $Volume))
							  ,array($Klingelsound), $Volume);

		IPS_Sleep(1000);

		IPS_SemaphoreLeave("Sonos");
	}	
	else
	{
		IPS_LogMessage($_IPS['SELF'],"Sonos durch Semaphore gesperrt");
	}																
}
?>

Ich verwende hier SNS_PlayFilesGrouping ohne Probleme.
Du kannst ja im Prinzip für jeden Lautsprecher ein eigenes Script erstellen.

Gruß
Dieter

Hallo Dieter,

danke für die Hinweise. Ich habe es nun ebenfalls so gelöst, dass ich jedem Lautsprecher ein Script zuweise. In einem Hauptscript 1 (getriggert durch Klingel 1) rufe ich diese z.B. mit

IPS_RunScriptEx(50660 /*[Geräte\Klingeln\Skripte\Klingel Dachterrasse]*/, Array("Nummer" => "eins"));

auf, in einem Hauptscript 2 (getriggert durch Klingel 2) z.B. mit

IPS_RunScriptEx(50660 /*[Geräte\Klingeln\Skripte\Klingel Dachterrasse]*/, Array("Nummer" => "zwei"));

so dass ich im Einzellautsprecherscript die Sounds wie folgt zuweisen kann:

$Nummer = $_IPS['Nummer'];
 
 if ($Nummer == "eins")
	{
	SNS_PlayFiles(32427 /*[Geräte\Audio\Sonos\SonosDt]*/, Array( "//RASPBERRYPI/RaspiHDDFreigabe/Musik/Klingeltoene/r 1.mp3"), 50);
	}
	
if ($Nummer == "zwei")
	{
	SNS_PlayFiles(32427 /*[Geräte\Audio\Sonos\SonosDt]*/, Array( "//RASPBERRYPI/RaspiHDDFreigabe/Musik/Klingeltoene/r 2.mp3"), 50);
	}

Das ist zwar nicht so professionell, wie es bei Dir ausschaut, aber es funktioniert bislang. Wenn ich Zeit habe, steige ich ggf. einmal um auf Deinen Vorschlag.

Viele Grüße…!