Steuerung der AS über http (Post, GET o.Ä.)

Status
Für weitere Antworten geschlossen.

ing-michel

Benutzer
Mitglied seit
19. Sep 2008
Beiträge
160
Punkte für Reaktionen
0
Punkte
16
Hallo würde gern die Audiostation über mein Wandtablet steuern. Dort habe ich ein Dash-Board für meine Smart-Haussteuerung programmiert. (Lichtsteuerung, Kameras, Wetter, Alarmanlage,etc...).

Nun würde nun auch gern die AS dort einbinden. Kennt jemand eine Möglichkeit die AudioStation per http anzusteuern?
Viele Grüße
Michel
 

heavygale

Benutzer
Mitglied seit
02. Jun 2012
Beiträge
315
Punkte für Reaktionen
2
Punkte
24
Die Audio Station ist eine Browser-Anwendung, die über HTTP geladen und dann im Browser ausgeführt wird. Wo soll sie denn bei dir laufen, wenn du sie über das Dashboard fernsteuern möchtest? Du kannst sie in einem Browser direkt im Dashboard aufrufen und dann auch darin steuern. Wenn die Musik aber anderswo abgespielt werden soll müsstest du dir einen Player suchen, der sich entsprechend fern steuern lässt - das wird mit der AudioStation alleine nicht funktionieren.
 

SaschaR

Benutzer
Mitglied seit
11. Apr 2014
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
Sorry, Heavygale, aber das ist Unsinn - und zwar kompletter. :p

Ja, du kannst die Audio Station z.B. per Post steuern. Am besten du schaust dir die Requests mit Fiddler o.ä. an. Was für ein Smarthome läuft bei dir?
 

heavygale

Benutzer
Mitglied seit
02. Jun 2012
Beiträge
315
Punkte für Reaktionen
2
Punkte
24
Interessant, das ist mir neu - aber ich lerne ja gerne dazu. :D

Wohin muss der POST-Request, gibt es da eine Schnittstellendokumentation von Synology dazu?
Wo läuft dann die AudioStation die du damit steuerst, wenn nicht im Browser auf dem gelchen Gerät?

Wenn du meine Aussage (ich vermute du beziehst dich auf meinen letzten Satz) als kompletten Unsinn abtust,
würde ich mir da schon etwas mehr an Fakten von deiner Seite wünschen. :rolleyes:
 
Zuletzt bearbeitet:

SaschaR

Benutzer
Mitglied seit
11. Apr 2014
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
Die AudioStation läuft auf der Synology. Natürlich brauchst du einen Airplay/DLNA-Lautsprecher, der Ton muss ja irgendwo rauskommen.
Hier sind ein paar Beispiele: klick.

Ich starte z.B. morgens automatisiert eine Playlist mit zwei Radiosendern: erst wird der erste Sender für Nachrichten auf zwei Airplay-Speakern abgespielt und nach ein paar Minuten dann der nächste Sender mit Musik. Wenn man im Bad das Licht (Hue) ausschaltet, wird auch das Streaming beendet...
 

ing-michel

Benutzer
Mitglied seit
19. Sep 2008
Beiträge
160
Punkte für Reaktionen
0
Punkte
16
Hallo,

ok, meine Frage war auch vielleicht etwas "schmal".

Also ein paar mehr Fakten:

Die Audio-Station (bzw. das Paket) läuft auf einer DS1815+ und ein DLNA und Airplay fähiger Verstärker ist vorhanden. Die Wiedergabe soll also nicht auf dem Tablet stattfinden.

Das Dashboard ist eine html/php-Seite, die auf meinem iPad aufgerufen wird. Dort sind verschiedene Button, die Informationen enthalten oder Aktionen ausfüren (zB. Lichtsteuerung, Infos über Wetter, Verbindungen, Webcams etc.)

Ich habe den Wunsch, dort einen Button zu schaffen, der mir z.B. einen Radiostream oder Playlist auf meinem Verstärker abspielt.
-> benötige also den Befehl an die AS: Spiele Stream x auf Gerät y ab.
 

SaschaR

Benutzer
Mitglied seit
11. Apr 2014
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
Hi,

ja, das geht alles. Ich würde mir ein kleines PHP-Script auf der Synology per Webserver verfügbar machen und vom Tablett aus nur die Links aufrufen.
Schau dir den Link mal an, das sollte dich schon weiterbringen - wenn nicht, gebe ich Starthilfe. :)
 

mördock

Benutzer
Mitglied seit
04. Jan 2012
Beiträge
806
Punkte für Reaktionen
17
Punkte
44
Moin,

verstehe ich dieses Thema richtig?
Ich könnte mit den Links und z.B. dieser https://play.google.com/store/apps/details?id=ch.rmy.android.http_shortcuts&hl=de App komfortabel DS Audio starten?
Wenn ja, bitte mehr Links oder eine Anleitung wie man die Links auslesen kann. Ich habe noch ein altes Tablet, Lust zu spielen, wenig Zeit. Aber ein Tablet an der Wand zur Steuerung von DS und Smarthome wäre schon cool.
Geht das auch mit anderen Synologyapps? Z.B. schnell mal einen bestimmten Notizzettel in DS Note bearbeiten, eine Diashow mit DS Photo starten usw., usw.

Gruß
Mördock
 

SaschaR

Benutzer
Mitglied seit
11. Apr 2014
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
Moin auch,

ja, das kannst du. Installiere dir am besten Fiddler, mach die AudioStation im Browser auf und schau, was da so passiert.
Du kannst ganz einfach per wget o.ä. POST-Requests abschicken - dazu würde ich mir, wie gesagt, ein kleines PHP auf der Synology ablegen.

Beispiel:
wget -qO - --save-cookies cookies_ms.txt --post-data "api=SYNO.API.Auth&version=2&method=login&account=USERNAME&passwd=PASSWORD&session=AudiStation&format=cookie" http://[COLOR=#ff0000]DEINESYNO[/COLOR]:5000/webapi/auth.cgi

...macht ein Login und speichert die Session in einem Cookie, damit kannst du dann weitermachen - z.B. Playlist wählen, Laustärke setzen, usw. usf.
 

ing-michel

Benutzer
Mitglied seit
19. Sep 2008
Beiträge
160
Punkte für Reaktionen
0
Punkte
16
Hi Sascha,

für mich reicht das noch nicht so ganz...:confused:

Dein o.g. Beispiel in eine PHP und die einmal aufrufen.

Nur wie komme ich zu den Befehlen, die dann die Aktionen ausführen (onclick oder so)?
hier :
https://github.com/kwent/syno/wiki/Audio-Station-API
habe ich was gefunden, aber die Verbindung fehlt mir leider...

Ich benötige z.b.: Player wählen, Lautstärke festlegen und z.B. einen Benutzerdefinierten Stream wiedergeben...

In deinem link zum synology.com - Forum habe ich auch mal geschaut. Wenn ich "http://192.168.1.7:5000/webapi/AudioStation/playlist.cgi?api=SYNO.AudioStation.Playlist&version=2&method=list "
abfrage bekomme ich "{"error":{"code":101},"success":false}"
 

SaschaR

Benutzer
Mitglied seit
11. Apr 2014
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
Ok, ich hole etwas weiter aus. Ich würde ein PHP auf der Syno ablegen, weil du dann eben leicht einzelne Befehle per Link auf dem Tablett aufrufen kannst. Ich bin nicht sicher, ob das speichern der Session auf dem Tablett so klappt. Lassen wir das erstmal beiseite und schauen uns das von einer Shell aus an:

Du musst dich zwingend an der Syno-API anmelden - der Benutzer muss Admin sein:
Rich (BBCode):
wget -qO - --save-cookies cookies_ms.txt --post-data "api=SYNO.API.Auth&version=2&method=login&account=USER&passwd=PASS&session=AudioStation&format=cookie" http://localhost:5000/webapi/auth.cgi
Dann kannst du dir z.B. die verfügbaren Playlists ausgeben lassen:
Rich (BBCode):
wget -qO - --load-cookies cookies_ms.txt --post-data "api=SYNO.AudioStation.Playlist&version=2&method=list" http://localhost:5000/webapi/AudioStation/playlist.cgi
Die Playlists werden als JSON geliefert, lesbarer wird es, wenn du es mit "| jq -r" aufrufst. Hier kommt z.B. Playlist4, die wir abspielen wollen:
"id": "playlist_shared_normal/4"

Das müssen wir nun URL encoded an die API übergeben.
Aus
Rich (BBCode):
[{"type":"playlist","id":"playlist_shared_normal/4"}]
wird also
Rich (BBCode):
%5B%7B%22type%22%3A%22playlist%22%2C%22id%22%3A%22playlist_shared_normal%2F4%22%7D%5D
und damit lautet der komplette Aufruf:
Rich (BBCode):
wget -qO - --load-cookies cookies_ms.txt --post-data "api=SYNO.AudioStation.RemotePlayer&method=updateplaylist&library=shared&id=__SYNO_Multiple_AirPlay__&offset=0&limit=0&play=true&version=2&containers_json=%5B%7B%22type%22%3A%22playlist%22%2C%22id%22%3A%22playlist_shared_normal%2F4%22%7D%5D" http://localhost:5000/webapi/AudioStation/remote_player.cgi
Hier habe ich auch gleich das Ausgabedevice gesetzt, hier eben mehrere Airplay Lautsprecher.
Dann noch ein "Play" und los geht's:
Rich (BBCode):
wget -qO - --load-cookies cookies_ms.txt --post-data "api=SYNO.AudioStation.RemotePlayer&method=control&id=__SYNO_Multiple_AirPlay__&version=2&action=play&value=0" http://localhost:5000/webapi/AudioStation/remote_player.cgi

Das mal so im Schnelldurchlauf. Im Synology-Forum findest du sicher noch den ein oder anderen Hinweis. Im Zweifel musst du wirklich mit dem Fiddler gucken, wie es das offizielle Frontend (Audio Station) macht.
Achja, http://www.asciitohex.com/ hilft beim codieren sehr. ;)

Viel Erfolg!
 

ing-michel

Benutzer
Mitglied seit
19. Sep 2008
Beiträge
160
Punkte für Reaktionen
0
Punkte
16
Moin Sascha. Das funktioniert alles soweit im Shell. Die Umsetzung nach PHP ist für mich momentan eine Stufe zu hoch. Daher danke ich dir soweit und verschiebe mein Projekt erstmal.

Liebe Grüße Michel
 

maulsim

Benutzer
Mitglied seit
24. Mai 2016
Beiträge
553
Punkte für Reaktionen
46
Punkte
48
Ich finde das ein spannendes Thema und habe mir dies mal etwas angeschaut. Ich frage mich, ist es auch möglich über ein PHP Skript auf einem Chromecast eine Wiedergabe zu starten? Wenn ja, wie würde dies funktionieren? Könnte man da gegebenenfalls mit fixen URLs zum Chromecast (IP oder der gleichen) arbeiten?
Bin in diesem Bereich mit der API noch ein Anfänger, aber hätte die Motivation mich hineinzuarbeiten, wenn dies mit Chromecasts auch gehen würde. Ich habe mal versucht über
Rich (BBCode):
webapi/AudioStation/remote_player.cgi?api=SYNO.AudioStation.RemotePlayer&version=2&method=list
die verfügbaren Player auszulesen - da ist aber die Liste leer. Oder ist der Ansatz falsch?

Bedeutet __SYNO_USB_PLAYER__ wenn ich an die Diskstation eine USB Soundkarte/Soundsystem anschließen würde, das darauf dann wiedergegeben wird?
 

SaschaR

Benutzer
Mitglied seit
11. Apr 2014
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
Ich wüsste nicht, warum das nicht funktionieren sollte. Ich habe kein Chromcast, aber die sollten ebenso gelistet werden.
Was liefert dir das via Shell (Login zuvor nicht vergessen):
Rich (BBCode):
wget -qO - --load-cookies cookies_ms.txt --post-data "api=SYNO.AudioStation.RemotePlayer&version=2&method=list" http://localhost:5000/webapi/AudioStation/remote_player.cgi|jq -r
 

maulsim

Benutzer
Mitglied seit
24. Mai 2016
Beiträge
553
Punkte für Reaktionen
46
Punkte
48
Danke, dass du mir dabei helfen möchtest.
Ich habe den Befehl einmal ausgeführt - zur Sicherheit auch als Admin. (Generell habe ich auch angefangen mir ein kleines php Skript zu basteln, was auch diese Befehle sendet, aber ich habe es zur Sicherheit auch noch einmal explizit über die Shell auf dem NAS gemacht. Das PHP Skript nutzt curl und funktioniert soweit auch mit dem unten beschriebenen.).
Also der Befehl liefert folgendes (ich hab die ID hier etwas verfälscht - aber das tut ja nichts zur Sache - weiß nicht genau wie geheim man diese halten sollte):
Rich (BBCode):
{
  "data": {
    "players": [
      {
        "id": "10AE601086AA",
        "is_multiple": false,
        "name": "AFTB",
        "password_protected": false,
        "support_seek": true,
        "support_set_volume": true,
        "type": "airplay"
      },
      {
        "id": "__SYNO_Multiple_AirPlay__",
        "is_multiple": true,
        "name": "Multiple AirPlay Devices",
        "password_protected": false,
        "support_seek": true,
        "support_set_volume": true,
        "type": "airplay"
      }
    ]
  },
  "success": true
}

Ich habe mal basierend auf diesem Link: https://forum.synology.com/enu/viewtopic.php?t=102647 den dort genannten Radiosender (war zu faul nen anderen zu suchen) auf dem AFTB abgespielt. Dafür habe ich natürlich die ID entsprechend auf die des AFTB gesetzt. Das funktioniert auch. Der Radiosender schallte fröhlich aus den Boxen. Letztendlich ist AFTB eine AirPlay Receiver App auf meinem FireTV. Man sieht aber, dass die Chromecast Geräte mit dem Befehl nicht aufgelistet werden.

Ich sollte noch dazu sagen, dass die Chromecast Geräte auch nicht in der Audio Station im Browser als Geräte angezeigt werden. Dies ist mal im folgenden Screenshot gezeigt:
syn_audio_station.png
Das die Chromecasts aber auf jeden Fall funktionieren weiß ich 1. aus der DS Audio App (Android) dort nutze ich Chromecast regelmäßig und 2. der Browser Chrome ermöglicht es mir auch den Ton auf einem Chromecast Gerät auszugeben. Aber das ermöglicht mir halt leider noch nicht so direkt einen "Stream" auf ein Chromecast Gerät über ein PHP Skript oder Shell Skript zu senden.

Ich vermute, dass dort nochmal eine zusätzliche API Schnittstelle genutzt wird - gegebenenfalls auch in Kombination mit einer Chromecast API Schnittstelle? Eine Theorie ist, dass die Chromecasts erst über die Chromecast API oder so gesucht werden müssen und man dann einen irgendwie generierten Stream/Playlist dort hin ballern kann. Ich habe aber auch so spontan noch keinen Ansatz, da ich mich damit im Rahmen von Entwicklung noch nicht auseinander gesetzt habe - bisher habe ich Chromecast einfach genutzt :)

Ich habe auch hier mal geschaut: https://github.com/kwent/syno/blob/master/definitions/AudioStation/6.0.1-3092/AudioStation.api (https://github.com/kwent/syno) dort habe ich mir auch versucht ein paar Befehle heraus zu suchen - aber da finde ich so spontan auch nichts (oder ich übersehe etwas).

Über jede Idee bin ich auf jeden Fall dankbar.

___________________________________________
Hier mal noch die PHP Schnipsel mit denen ich momentan rumspiele für die Leute die es interessiert. Ob das so sinnvoll, effizient, sicher etc. ist, weiß ich aber noch nicht. Erstmal war ich froh, dass es funktioniert hat :).
PHP:
/* STEP 1 create temporary cookie file */
$ckfile = tempnam("/tmp", "CURLCOOKIE");
/* STEP 2 login to set cookie properly */
$ch = curl_init ("http://IPNAS:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=login&account=USERNAME&passwd=PASSWORT&session=AudioStation&format=cookie");
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
echo $output.'<br /><br />'; //sollte success ausgeben
/* STEP 3 do something in Audio Station */
//read playlists
$ch = curl_init ("http://IPNAS:5000/webapi/AudioStation/playlist.cgi?api=SYNO.AudioStation.Playlist&version=2&method=list");
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
$jsonOut = json_decode($output,true);
//listet nun alle Playlists auf - Einfache Liste, um überhaupt erstmal etwas zu sehen!
echo "<b>".count($jsonOut['data']['playlists'])." Playlists vorhanden!</b><br>";
foreach($jsonOut['data']['playlists'] as $playlist)
{
	echo "<ul>";
	echo "<li>id: ".$playlist['id']."</li>";
	echo "<li>library: ".$playlist['library']."</li>";
	echo "<li>name: ".$playlist['name']."</li>";
	echo "<li>path: ".$playlist['path']."</li>";
	echo "<li>sharing_status: ".$playlist['sharing_status']."</li>";
	echo "<li>type: ".$playlist['type']."</li>";
	echo "</ul>";
}

/* STEP 4 logout and destroy cookiefile*/
$ch = curl_init ("http://IPNAS:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=logout&session=AudioStation");
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
echo $output.'<br><br>'; //sollte auch ein success geben
unlink($ckfile);
 

maulsim

Benutzer
Mitglied seit
24. Mai 2016
Beiträge
553
Punkte für Reaktionen
46
Punkte
48
Da ich meinen vorherigen Beitrag jetzt nicht mehr bearbeiten kann mache ich mal einen Doppelpost, ich hoffe mir sei da verziehen.

Ich kann auf die Chromecast Wiedergabe auch (wie typisch bei Chromecast) nur im lokalen Netzwerk zugreifen. Läuft aber mein FireTV und ich bin an einem anderen Ort, so wird mir im Browser bei meinen Geräten und auch über den oben bereits genannten Befehl das AFTB Gerät sowie "Mehre Airplay" Geräte aufgelistet. Das heißt da scheint von der Schnittstelle her schon etwas anders zu sein. Ist mein FireTV aus, so ist natürlich auch das AFTB Airplay Gerät weg und es wird mir nur "Mein Computer" im Browser bzw. über den Befehl kein Device angezeigt.

Ich weiß aber auch nicht wo z.B. die aktuelle Wiedergabeliste für den Chromecast gespeichert wird. Denn die Wiedergabeliste bleibt vorhanden, auch wenn ich aus dem Netzwerk herausgehe und die Wiedergabe stoppt auch nicht, wenn ich weg bin und man kann auch von mehreren Geräten die Wiedergabeliste verwalten. Da ist also meiner Meinung nach eine Verbindung zwischen dem NAS und dem Chromecast.

In der DS Audio Android App wähle ich den Chromecast einfach als Player aus.
 
Zuletzt bearbeitet:

maulsim

Benutzer
Mitglied seit
24. Mai 2016
Beiträge
553
Punkte für Reaktionen
46
Punkte
48
Hier scheint keiner mehr eine Idee zu haben oder?
 

ing-michel

Benutzer
Mitglied seit
19. Sep 2008
Beiträge
160
Punkte für Reaktionen
0
Punkte
16
Ich bin noch am Ball. Melde mich, wenn ich was herausgefunden habe!
 

ing-michel

Benutzer
Mitglied seit
19. Sep 2008
Beiträge
160
Punkte für Reaktionen
0
Punkte
16
Hi,
habe es jetzt wie folgt probiert:

PHP:
<?php
/* STEP 1 create temporary cookie file */
$ckfile = tempnam("/tmp", "CURLCOOKIE");
/* STEP 2 login to set cookie properly */
$ch = curl_init ("http://192.168.1.105:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=login&account=michel&passwd=xyz&session=AudioStation&format=cookie");
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
echo $output.'<br /><br />'; //sollte success ausgeben

//select_ndr playlist
$ch = curl_init ("http://192.168.1.105:5000/webapi/AudioStation/remmote_player.cgi?api=SYNO.AudioStation.RemotePlayer&method=updateplaylist&library=shared&id=__SYNO_Multiple_AirPlay__&offset=0&limit=0&play=true&version=2&containers_json=%5B%7B%22type%22%3A%22playlist%22%2C%22id%22%3A%22playlist_shared_normal%2F182%22%7D%5D");
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
$jsonOut = json_decode($output,true);

print_r($jsonOut);
echo'<br>';
// play

$ch = curl_init ("http://192.168.1.105:5000/webapi/AudioStation/remmote_player.cgi?api=SYNO.AudioStation.RemotePlayer&method=control&id=__SYNO_Multiple_AirPlay__&version=2&action=play&value=0");
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
$jsonOut = json_decode($output,true);

print_r($jsonOut);

/* STEP 4 logout and destroy cookiefile*/
$ch = curl_init ("http://192.168.1.105:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=logout&session=AudioStation");
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
echo $output.'<br><br>'; //sollte auch ein success geben
unlink($ckfile);

?>

Aber es tut sich nix...
 

maulsim

Benutzer
Mitglied seit
24. Mai 2016
Beiträge
553
Punkte für Reaktionen
46
Punkte
48
Was meinst du mit "es tut sich nix..."? Kommt auch beim Login schon kein success? oder irgendwo in den nächsten schritten das Problem
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat