Dienstag, 10. Oktober 2017

Amazon Alexa per Shell fernsteuern (Echo remote control)

Nachdem Amazon mit dem Multiroom Feature der Echos meine alten Multiroom Audio Bemühungen quasi nebenbei erledigt hat, fehlte mir zu meinem Glück noch die Fernsteuerung meiner Echos.

Wenn ich nach Hause komme, soll die Home Automation bitte auch gleich das Radio auf den Amazon Echos einschalten.
Für den umgekehrten Weg nutze ich HA-Bridge, welches meine Intertechno Billigsteckdosen per Alexa Sprachkommando schaltet. Daher kenne ich auch die Möglichkeit, über einen Browser auf das Alexa Interface zuzugreifen.

Was ein Browser kann, das sollte sich doch auch per Shell bewältigen lassen...

Ich habe die Entwicklertools im Firefox benutzt (Shift + Strg + i) und auf dem Reiter "Netzwerkanalyse" den Datenverkehr verfolgt. Zusätzlich habe ich Javascript abgeschaltet, da ich nicht mit irgendwelchen riesigen Frameworks hantieren wollte - und meine Shell kann kein Javascript.

Zunächst hatte mein cURL keine Cookies speichern wollen. Das änderte sich erst, nachdem ich den "User-Agent" Header hinzugefügt habe. 

Komischerweise schlägt auf diese Weise selbst im Browser die erste Anmeldung fehl. Bei genauerer Betrachtung ändert sich allerdings die Referer URL, in die nun die Session kodiert ist. So klappt dann auch das Login.

Außerdem ist zwingend ein "Accept-Language:" Header erforderlich - daraus leitet Amazon wahrscheinlich die Region für das Login ab.
Update 2018-01-28: Nachdem ich einfach nur "Mozilla/5.0" als Browser String verwendet hatte, funktionierte es auch eine Weile. Inzwischen muss ich einen real existierenden (aktuellen) Browser String verwenden!

Im Alexa Webfrontend angekommen, sind hauptsächlich die POST Anfragen interessant, immer dann habe ich eine Aktion im Frontend ausgelöst.

Da bei vielen Anfragen nur JSON Antworten zurückkommen, brauchte ich noch einen JSON Parser für die Kommandozeile und bin auf jq gestoßen. Die Einarbeitung ist etwas kryptisch, aber die Ergebnisse sehr lohnenswert.
Und wenn man schon einen JSON Parser hat, kann man eigentlich auch gleich die TuneIn Sender per Sendernamen suchen lassen und aus dem ersten Antworteintrag die StationID extrahieren...

Es gibt auch eine Version ohne JSON Parser mit weniger Funktionen (kein -i, -p, -P, -S, keine Radio Stationsnamen).

Funktionsbeschreibung

Am Anfang ist es evtl hilfreich eine Liste der Alexa kompatiblen Geräte zu holen
alexa_remote_control.sh -a
Wird später kein Gerät ausgewählt, nutzt das Script immer das erste Echo(dot)-Gerät in der Liste.
Ein Gerät darf selbstverständlich auch eine Multiroom-Gruppe sein.

Jetzt kann man bei TuneIn einen Sender suchen lassen und diesen auf einem Gerät (z.B. Wohnzimmer) in der Liste abspielen...
alexa_remote_control.sh -d Wohnzimmer -r "radioeins vom rbb"
...oder man kennt die TuneIn StationID.
alexa_remote_control.sh -d Wohnzimmer -r s25111
Möchte man sämtliche Wiedergaben stoppen, gibt es ein spezielles Gerät ALL.
alexa_remote_control.sh -d ALL -e pause

Es gibt weiterhin ein paar Funktionen, um die Amazon Bibliotheken abzufragen:
alexa_remote_control.sh -i
Legt eine Liste der zu Amazon hochgeladenen Tracks an "/tmp/.alexa.IMPORTED.list". Die enthaltene trackId wird für die für Option -s verwendet.
alexa_remote_control.sh -p
Legt eine Liste der bei Amazon gekauften Tracks an "/tmp/.alexa.PURCHASES.list". Die enthaltene trackId wird für die für Option -s verwendet.
alexa_remote_control.sh -P
Legt eine Liste aller Amazon Playlists an "/tmp/.alexa.prime-playlist-browse-nodes.list". Die enthaltene asin wird für die für Option -t verwendet
alexa_remote_control.sh -S
Legt eine Liste aller Amazon Stationen an "/tmp/.alexa.prime-sections.list". Die enthaltene seedId wird für die für Option -u verwendet

Um einen Bibliothekstrack abzuspielen, benötigt man die trackId
alexa_remote_control.sh -d Esszimmer -s 162ab3024d22a-401a-93f4-123456-7890ab
Alternativ kann man auch ein Bibliotheksalbum abspielen und benötigt dazu den Artist und den Albumtitel
alexa_remote_control.sh -d Esszimmer -s 'Beethoven' 'Sinfonie No.9'
Um eine Prime Playlist abzuspielen, benötigt man die asin
alexa_remote_control.sh -d Esszimmer -t B01DWABCDE
Um einen Prime Radiostation abzuspielen, benötigt man die seedId
alexa_remote_control.sh -d Esszimmer -u A30GBP8ABCDEF
Als Prime Benutzer kann man per Sprachkommando auch bestimmte Interpreten spielen lassen. In der Oberfläche fehlt eine entsprechende Steuermöglichkeit. Fragt man den aktuellen Play-Status in diesem Fall aber mit de -q Option ab, so erhält man eine queueId (Device spezifisch), die man später mit folgendem Kommando erneut abspielen kann:
alexa_remote_control.sh -d Esszimmer -v 1f4919d7-45db-45cf-a47f-123456-7890ab

Es können nun auch Multiroom Gruppen angelegt und gelöscht werden
alexa_remote_control.sh -m <Gruppe>
löscht die Multiroomgruppe
alexa_remote_control.sh -m <Gruppe> <Gerät1> ... <GerätX>
löscht die Multiroomgruppe und legt sie mit den Geräten 1..X neu an

Bluetooth Verbindungen werden mit der Option -b hergestellt/getrennt/gelistet:
alexa_remote_control.sh -d Esszimmer -b list
Listet alle bekannten Bluetooth Geräte für Esszimmer. Als Adresse kann je nach Bluetooth-Gerät evtl. auch ein mehrstelliger Code angezeigt werden - es muss nicht zwangsläufug eine Bluetooth HW-Adresse sein.
alexa_remote_control.sh -d Esszimmer -b "AA:BB:CC:DD:EE:FF"
Verbindet Gerät "AA:BB:CC:DD:EE:FF"
alexa_remote_control.sh -d Esszimmer -b
Trennt Bluetooth im Esszimmer
Evtl. muss das erste Pairing zuvor einmalig mit der Alexa App erfolgt sein.

Für die aktuellen Abspielinformationen (Option -q) kommen prinzipiell drei URLs zum Einsatz (ab Zeile 687):
https://layla.amazon.de/api/np/player?deviceSerialNumber=${DEVICESERIALNUMBER}&deviceType=${DEVICETYPE}&lemurId=${PARENTID}&lemurDeviceType=${PARENTDEVICE}
https://layla.amazon.de/api/media/state?deviceSerialNumber=${DEVICESERIALNUMBER}&deviceType=${DEVICETYPE}
https://layla.amazon.de/api/np/queue?deviceSerialNumber=${DEVICESERIALNUMBER}&deviceType=${DEVICETYPE}
Die Ausgaben werden momentan von "jq" ungefiltert ausgegeben.

Update 2018-02-27:
Wer bei HA-Bridge bereits versucht hat den IP-Filter zu nutzen, um Geräte im jeweiligen Raum mit dem gleichen Kommando einzuschalten, wird damit wahrscheinlich gescheitert sein, da Amazon die HUE-Verarbeitung bei mehreren Echos im Round-Robin Prinzip verteilt. D.h. das Bridge-Kommando kommt nicht unbedingt von dem Echo, der das Sprachkommando empfangen hat.
Dazu hat Markus Wennesheimer in seinem Blog eine Lösung gefunden, indem er den Activity-Feed hinsichtlich der letzten Aktion befragt.
Das Gerät, welches zuletzt einen Voice Befehl empfangen hat fragt dazu folgendes Kommando ab:
alexa_remote_control.sh -lastalexa
(Die Plain-Version kann nur die DeviceSerialNumber wiedergeben.)

Noch ein Wort zum Cookie; das Script (also eigentlich cURL) legt eine Datei /tmp/.alexa.cookie an, in die aktuell gültigen Cookie Infrmationen abgelegt sind. Analog dazu existiert eine Session auf den Amazon Servern. Bei jedem Script-Start wird überprüft, ob die Session noch gültig ist. Falls nicht, beginnt der Login Prozess erneut und die "frischen" Session Informationen werden ins Cookie geschrieben.

Zum Einen erzeugt man auf diese Weise nicht unnötig viele Login/Logout Vorgänge, die Amazon evtl. zur Sperrung veranlassen könnte. Allerdings bedeutet das auch, dass die aktuelle Session auch bei Amazon aktiv ist. D.h. wenn man das Script auf hunderten verschiedener Geräte ausführt, sollte man vielleicht lieber mit dem "-l" Parameter die Session beenden (damit wird die Cookie-Datei ebenfalls gelöscht).

Auf einem Multi-User System ist das Cookie außerdem für jeden lesbar (kann so aber auch von mehreren Prozessen verwendet werden). Schreiben darf allerdings nur der Benutzer, dem das Cookie gehört - wenn man als "root" getestet hat, kann eine "normaler Benutzer" das Cookie nie erneuern!!

Update 2018-06-12:
Das meistnachgefragte Feature TextToSpeech (TTS) ist nun endlich verfügbar. Dazu habe ich mich mit Hilfe von Ralf Otto bei den Sourcen des openHAB2 Amazon Echo Control Bindings von Michael Geramb bedient.
Text2Speech:
alexa_remote_control.sh -d Esszimmer -e speak:'Guten_Appetit!'

Routinen sollten sich nun ebenfalls starten lassen
alexa_remote_control.sh -d Esszimmer -e automation:'Welcome home'

Neben den "speak" und "automation" Funktionen gibt es noch weitere Kommandos
alexa_remote_control.sh -e [weather,traffic,flashbriefing,goodmorning,singasong,tellstory]

Update 2019-01-22:
Die Konfigurationsvariablen können nun auch per Environment an das Script übergeben werden (z.B. von Webserver mit PHP):
EMAIL     - your login email
PASSWORD  - your login password
BROWSER   - the User-Agent your browser sends in the request header
LANGUAGE  - the Accept-Language your browser sends in the request header
AMAZON    - your Amazon domain
ALEXA     - the URL you would use for the Alexa Web App
CURL      - location of your cURL binary
OPTS      - any cURL options you require
TMP       - location of the temp dir
OATHTOOL  - command line for oathtool MFA
MFA_SECRET- the MFA secret
SPEAKVOL  - the volume for speak messages
NORMALVOL - if no current playing volume can be determined, fall back to normal volume
VOLMAXAGE - max. age in minutes before volume is re-read from API
DEVICEVOLNAME   - a list of device names with specific volume settings (space separated)
DEVICEVOLSPEAK  - a list of speak volume levels - matching the devices above
DEVICEVOLNORMAL - a list of normal volume levels- matching the devices above
USE_ANNOUNCEMENT_FOR_SPEAK - Announcements can be made to multiple devices, while regular SPEAK cannot
                             but the announcement feature has to be turned on for those devices

Update 2019-07-08:
Es ist ziemlich wahrscheinlich, dass Multi-Faktor (MFA) aktivierte Anmeldungen keine Captcha Screens bekommen. Außerdem sollte man alle Accounts, die die Möglichkeit bieten heutzutage per MFA sichern.
Dank dem User rich-gepp habe ich auf GitHub eine Code-Ergänzung erhalten, die die Einmalpasswortgenerierung per oathtool erledigt. Dazu sind folgende Schritte erforderlich:
  1. MFA per App sollte im Amazon Account bereits eingerichtet sein und funktionieren
  2. Neue App registrieren
  3. Wenn der QR-Code angezeigt wird auf "kann nicht gescannt werden" klicken
  4. Der MFA String wird angezeigt, z.B. "1234 5678 9ABC DEFG HIJK LMNO PQRS TUVW XYZ0 1234 5678 9ABC DEFG"
  5. Die Antwort wird mit dem oathtool erzeugt: oathtool -b --totp "<MFA shared secret von oben>" und muss in die Eingabemaske eingetragen werden (Achtung, der Code ist nur ein paar Sekunden lang gültig!
  6. Wenn das geklappt hat ist der MFA String das MFA_SECRET für das alexa_remote_control Script
Update 2020-01-03:
Ich habe in der "großen" Variante nun auch eine -z Option eingebaut, um die Lautstärke zu ermitteln.
Diese Funktionalität wird für das Zurücksetzen der Lautstärke nach Ansagen benötigt.
Am zuverlässigsten scheint das zu funktionieren, wenn Multiroom-Gruppen definiert sind, dort wird nämlich die Lautstärke für alle "Teilnehmer" mitgeführt.

Ich versuche zunächst die Lautstärke über /api/media/state zu holen und wenn das nicht funktioniert, suche ich das Multiroom-Parent-Device und hole mir dort den Status. Aus diesem Grund funktioniert es leider auch noch nicht in der "plain" Version - zu viel JQ parsing...

Aus Performancegründen cache ich die letzten Volume Einstellungen für "$VOLMAXAGE" Minuten.

Update 2020-02-09:
Nun gibt es (zunächst in der "großen" Variante") auch die Möglichkeit, sowohl SSML für TTS zu nutzen, als auch TTS auf Multiroom-Gruppen zu machen. (Ich ermittle dafür die Mitglieder einer Multiroom-Gruppe im Script.)
Realisiert wird das per Announcement/Ankündigung. Dafür muss dieses Feature in jedem Echo Gerät unter "Kommunikation" aktiviert sein!!!
alexa_remote_control.sh -d Überall \
 -e speak:'<speak><amazon:effect name="whispered">hallo du</amazon:effect></speak>'

Außerdem gibt es ein neues Kommando:
alexa_remote_control.sh -e sound:amzn_sfx_trumpet_bugle_04

Die möglichen Sound-Library-Einträge muss man leider ausprobieren. Von den vier möglichen Trompetenklängen funktioniert z.B. nur der oben gezeigte. Welche Klänge es gibt, sieht man wenn man einer Routine "Töne" hinzufügt.

Update 2021-05-27:
Die sogenannten Sequence-Kommandos (speak, weather, traffic, etc.) haben ein großes Update bekommen. Das Announcement/Ankündigung Feature führte leider zu merkwürdigem Verhalten und wird nicht mehr benutzt. Sämtliche SSML Funktionen lassen sich nun mit regulärem Alexa.Speak nutzen.

alexa_remote_control.sh -d Überall \
 -e speak:"<speak><voice name='Hans'>Hallo ich bin Hans</voice><audio src='soundbank://soundlibrary/musical/amzn_sfx_trumpet_bugle_03'/> und ich bin Alexa</speak>"

Die Lautstärkeregelung wurde in diesem Zusammenhang überarbeitet. Die Ermittlung der aktuellen Lautstärke per API Aufruf funktioniert inzwischen sehr zuverlässig, so dass nach einem Sequence Kommando die alte Lautstärke wiederhergestellt werden kann.
Besitzt man unterschiedliche Geräte, dann lässt sich die Sprachlautstärke pro Gerät einstellen:

DEVICEVOLNAME='EchoZimmer1 EchoZimmer2 EchoZimmer3' \
DEVICEVOLSPEAK='100 20 25' \
  alexa_remote_control.sh -d Überall \
  -e speak:Hallo

Außerdem habe ich mich entschieden, die "Plain" Variante nicht weiter zu pflegen. Es ist extrem mühselig JSON ohne Hilfe von JQ in der Shell zu parsen. Eine sinnvolle Weiterentwicklung ist so nicht möglich. Zudem sollte JQ inzwischen auf den meisten Plattformen verfügbar sein.

Update 2021-09-02:
TuneIn Stationen können wieder abgespielt werden. Amazon hat einen Teil der API geändert. Es kann gut sein, dass Prime Stations und Playlists nicht mehr funktionieren.

Allerdings ist es nun möglich auf die verschiendenen Musik Kanäle zuzugreifen:

alexa_remote_control.sh -d Esszimmer -e playmusic:AMAZON_MUSIC:'Beethoven Sinfonie No.9'
Alle möglichen Kanäle listet:
alexa_remote_control.sh -c

Abspielen auf Multi-Room Geräten wird bisher nicht unterstützt. Stattdessen versucht das Script auf allen Mitgliedern des Multi-Room Geräts parallel abzuspielen, was zu merkwürdigen Resultaten führen kann. Im besten fall spielt der Stream nicht ganz synchron....

Fertiges Script

(download link / Version ohne "jq" - nicht mehr gepflegt!)

#
# Amazon Alexa Remote Control
#  alex(at)loetzimmer.de
#
# 2017-10-10: v0.1 initial release
# 2017-10-11: v0.2 TuneIn Station Search
# 2017-10-11: v0.2a commands on special device "ALL" are executed on all ECHO+WHA
# 2017-10-16: v0.3 added playback of library tracks
# 2017-10-24: v0.4 added playback information
# 2017-11-21: v0.5 added Prime station and playlist
# 2017-11-22: v0.6 added Prime historical queue and replaced getopts
# 2017-11-25: v0.6a cURL is now configurable
# 2017-11-25: v0.7 added multiroom create/delete, playback of library playlist
# 2017-11-30: v0.7a added US config, fixed device names containing spaces
# 2017-12-07: v0.7b added Bluetooth connect/disconnect
# 2017-12-18: v0.7c fixed US version
# 2017-12-19: v0.7d fixed AWK csrf extraction on some systems
# 2017-12-20: v0.7e moved get_devlist after check_status
# 2018-01-08: v0.7f added echo-show to ALL group, TuneIn station can now be up to 6 digits
# 2018-01-08: v0.8 added bluetooth list function
# 2018-01-10: v0.8a abort when login was unsuccessful
# 2018-01-25: v0.8b added echo-spot to ALL group
# 2018-01-28: v0.8c added configurable browser string
# 2018-02-17: v0.8d no need to write the cookie file on every "check_status"
# 2018-02-27: v0.8e added "lastalexa" option for HA-Bridge to send its command to a specific device
#               (Markus Wennesheimer: https://wennez.wordpress.com/light-on-with-alexa-for-each-room/)
# 2018-02-27: v0.9 unsuccessful logins will now give a short info how to debug the login
# 2018-03-09: v0.9a workaround for login problem, force curl to use http1.1
# 2018-05-17: v0.9b update browser string and accept language
# 2018-05-23: v0.9c update accept language (again)
# 2018-06-12: v0.10 introducing TTS and more
#               (thanks to Michael Geramb and his openHAB2 Amazon Echo Control binding)
#               https://github.com/openhab/openhab2-addons/tree/master/addons/binding/org.openhab.binding.amazonechocontrol
#               (thanks to Ralf Otto for implementing this feature in this script)
# 2018-06-13: v0.10a added album play of imported library
# 2018-06-18: v0.10b added Alexa routine execution
# 2019-01-22: v0.11 added repeat command, added environment variable parsing
# 2019-02-03: v0.11a fixed string escape for automation and speak commands
# 2019-02-10: v0.12 added "-d ALL" to the plain version, lastalexa now checks for SUCCESS activityStatus
# 2019-02-14: v0.12a reduced the number of replaced characters for TTS and automation
# 2019-06-18: v0.12b fixed CSRF
# 2019-06-28: v0.12c properly fixed CSRF
# 2019-07-08: v0.13 added support for Multi-Factor Authentication
#               (thanks to rich-gepp https://github.com/rich-gepp)
# 2019-08-05: v0.14 added Volume setting via routine, and $SPEAKVOL
# 2019-11-18: v0.14a download 200 routines instead of only the first 20
# 2019-12-23: v0.14b Trigger routines by either utterance or routine name
# 2019-12-30: v0.15 re-worked the volume setting for TTS commands
# 2020-01-03: v0.15a introduce some proper "get_volume"
# 2020-01-08: v0.15b cleaned merge errors
# 2020-02-03: v0.15c SPEAKVOL of 0 leaves the volume setting untouched
# 2020-02-09: v0.16 TTS to Multiroom groups via USE_ANNOUNCEMENT_FOR_SPEAK + SSML for TTS
#               (!!! requires Announcement feature to be enabled in each device !!!)
# 2020-02-09: v0.16a added sound library - only very few sounds are actually supported
#               ( https://developer.amazon.com/en-US/docs/alexa/custom-skills/ask-soundlibrary.html )
# 2020-06-15: v0.16b added "lastcommand" option
#               (thanks to Trinitus01 https://github.com/trinitus01)
# 2020-07-07: v0.16c fixed NORMALVOL if USE_ANNOUNCEMENT_FOR_SPEAK is set
# 2020-12-12: v0.17 added textcommand which lets you send anything via CLI you would otherwise say to Alexa
#               ( https://github.com/thorsten-gehrig/alexa-remote-control/issues/108 )
# 2020-12-12: v0.17a sounds now benefit from SPEAKVOL
#                    fixed TuneIn IDs to also play podcasts
# 2021-01-28: v0.17b fixed new API endpoint for automations
#               (thanks to Michael Winkler)
# 2021-01-28: v0.17c simplified volume detection using new DeviceVolumes endpoint
#               (thanks to Ingo Fischer)
# 2021-05-27: v0.18 complete rework of sequence commands especially for TTS
#                    Announcement feature is no longer required due to inconsistent SSML handling
# 2021-09-02: v0.19 Playing TuneIn works again using new entertainment API endpoint
#               Added playmusic (Alexa.Music.PlaySearchPhrase) as command, for available channels use "-c"
#               Note: playmusic is not multi-room capable, doing so might lead to unexpected results
# 2021-09-13: v0.20 implemented device registration refresh_token cookie exchange flow as an alternative
#               to logging in
#
###
#
# (no BASHisms were used, should run with any shell)
# - requires cURL for web communication
# - (GNU) sed and awk for extraction
# - jq as command line JSON parser (optional for the fancy bits)
# - base64 for B64 encoding (make sure "-w 0" option is available on your platform)
# - oathtool as OATH one-time password tool (optional for two-factor authentication)
#
##########################################

(see download links above)

62 Kommentare:

  1. Ich hätte eine Anregung für die zukünftige Weiterentwicklung des Alexa Paketes. Es wäre schön und sicher für Viele interessant, zukünftig auch noch gleich eine regelmäßige automatische Löschung des Alexa Sprachverlaufes mit zu implementieren.
    So etwas hat Stefan Franke " https://forum.iobroker.net/topic/9243/script-deletealexaactivities-l%C3%B6scht-jeden-tag-alle-aufgenommenen-sprachbefehle " mal vorgestellt.
    Leider kann ich nicht einschätzen, ob so etwas machbar ist. Es wäre aber sicher heutzutage eine für viele Nutzer wünschenswerte Option. Ich konnte im Homematic Forum auch keine sonstige automatische Lösung dafür finden.

    AntwortenLöschen
  2. Wie findet man denn die Tracknummer für einen Titel bei Amazon heraus?
    Bspw: https://music.amazon.de/albums/B008839OBC?trackAsin=B00883A2KY&ref=dm_sh_f0fb-5d51-dmcp-be70-05fa4&musicTerritory=DE&marketplaceId=A1PA6795UKMFR9

    Bitte um Hilfe.
    Danke

    AntwortenLöschen
    Antworten
    1. Hat hier keiner einen Tipp?

      Löschen
    2. Ich musste bisher die Titel in der Amazon App heruntergeladen haben. Anschließend sollten sie mit "-p" in deiner Library sichtbar sein.

      Löschen
    3. Hallo,
      leider nicht.
      Hier werden nur die gekauften Titel angezeigt.
      Der Titel ist aber nicht gekauft, sondern im "Paket" dabei.
      Gibt es hier eine weitere Möglichkeit?
      Ciao

      Löschen
    4. Sorry, musste mir das selbst nochmal anschauen...

      Du musst die Titel einmalig mit der Amazon Music App heruntergeladen haben, damit sie für Alexa sichtbar sind (egal mit welchem Telefon)!!!

      Anschließend kannst du mit "-s 'Artist Name' 'Album Name/Titel'" das Album bzw. den Titel abspielen. Die Schreibweise muss exakt so lauten wie in der Amazon Music App.

      Kontrollieren kannst du die verfügbaren Titel in der Web App alexa.amazon.de

      Löschen
  3. What is the syntax for -m option? An example please. I get an error trying to create the multiroom group. Numbers changed for security

    alexa_remote_control.sh -m "AlarmGroup" B0F007144355023F
    Creating multi room dev:AlarmGroup member_dev(s): B0F007144355023F
    ERROR: unkown device dev:B0F007144355023F

    AntwortenLöschen
    Antworten
    1. instead of using the internal device id, you should use the Echo's name, e.g.
      alexa_remote_control.sh -m "AlarmGroup" MyEcho1 MyEcho2

      Löschen
    2. Thanks, i was afraid of that. My devices have spaces in the name for example “Echo Show Kitchen”. I tried using single and double quotes, but it errors. I renamed on device to a name without spaces and it worked. Is there a way to escape or use devices with spaces in the device name?

      Löschen
    3. regardless, thank you for this fine work! Love it!

      Löschen
    4. replace spaces with underscores - that should work!

      Löschen
  4. Hallo,
    für eine Anwendung in Hotels würde ich gerne die Sprache des jeweiligen Echo-Geräts auf die Sprache des eingecheckten Gastes remote anpassen. Was müsste im Skript dazu ergänzt werden?

    AntwortenLöschen
    Antworten
    1. Sprache auf Deutsch:
      https://alexa.amazon.de/api/device-locale/${DEVICESERIALNUMBER}/${DEVICETYPE}
      Anfragemethode:PUT
      Inhalt: {"locale":"de-DE"}

      Sprache auf US Englisch:
      https://alexa.amazon.de/api/device-locale/${DEVICESERIALNUMBER}/${DEVICETYPE}
      Anfragemethode:PUT
      Inhalt: {"locale":"en-US"}

      Eine liste aller verfügbaren Locales liefert ein GET auf https://alexa.amazon.de/api/get-languages

      Löschen
  5. Hallo Alex,
    was muss man denn tun damit die Alexa - Listre aktuialisiert wird.
    Habe gestern schon in der App eine Alexa umbenannt aber mit der -a Option ist immer noch der alte Name da.
    Danke

    AntwortenLöschen
    Antworten
    1. Lösch einfach die Datei

      .alexa.devicelist.json

      im Unterordner alexa_remote_temp
      Dann holt er sich beim nächsten Aufruf eine neue Liste

      Löschen
    2. Nachtrag: Bei dir wird es der /tmp/ Ordner sein, ich hatte das mir auf einen anderen Pfad gesetzt. Also nicht Unterordner sondern vom Stammpfad / aus den Ordner /tmp/
      Oder dein Linux einmal neustarten (sollte den Ordner /tmp/ leeren)

      Löschen
    3. Ja, um die Anfragen möglichst gering zu halten, cache ich die Devicelist. @BLinz hat die Lösung bereits geschildert. Einfach die .alexa.devicelist* aus deinem Temp-Ordner löschen.

      Löschen
  6. Hallo Alexander. Danke für die tolle Arbeit. Mit einer Sache habe ich noch Probleme. Der Echo Dot 3 spielt leide (20%) Musik ab. Wenn ich dann einen TTS schicke (TTS Volume auf 100%), dann regelt der Echo Dot sofort auf 100%, also während noch die letzten Töne der Musik kommen. Erst nach ca 1 Sekunde kommt die TTS Nachricht. Man erschreckt sich immer, wenn die Musik plötzlich auf volle Pulle springt. Denkst du es ist möglich ein automatisches Pause->TTS->Resume einzubauen? Gruß Tim

    AntwortenLöschen
    Antworten
    1. Ja, das passiert bei mir leider auch - der Unterschied 20%-100% ist aber auch mächtig viel. Du kannst die SPEAKVOL im Script oder per ENV var einstellen.

      Eine Verzögerung einzubauen wäre cool, aber ich wüsste nicht wie (müsste als Teil einer Routine erfolgen).
      Wenn ich einfach drei REST-Calls nacheinander machen würde, dann käme vermutlich schon bald ein "Too many requests" Error.

      Löschen
  7. Hallo Alexander,
    erst mal vielen Dank für das Skript. Mega Job und "Hut ab" dafür. Ich werde meine Echos wohl nun für meine haussteuerungsrelevanten Ansagen nutzen. Bis lang lief das über Sonos. Klappt gut, aber macht bei gestreamter Musik Probleme, da die Musik nach einer Aktion stoppt.
    Ich habe es nicht gefunden, ggf. ist die Funktion aber irgendwo versteckt. Kann ich die Echos gezielt oder als Gruppe mit einem direkten Befehl auf z.B. Lautstärke 3 setzen? Ich könnte das über die Routine aufrufen, aber ein Befehl auf eine Gruppe die alle Echos beinhaltet ist eleganter. Geht das?

    Eine weitere Frage bezieht sich auf hochgeladene Musik. Eigene Musik hochzuladen ist wohl nicht mehr möglich. Ich würde jedoch gern als Haustürklingel einen kurzen mp3 clip abspielen. Kann man das irgendwie bewerkstelligen?

    Gruß
    Daniel

    AntwortenLöschen
    Antworten
    1. Bzgl. der Lautstärke gibt es '-e vol:0-100' (was inzwischen als Routine ausgeführt wird). Wenn du sämtliche Echos ansprechen möchtest, dann kannst du das spezielle Gerät "ALL" verwenden (-d ALL).

      Wegen des MP3 Clips, gibt es meines Wissens keine einfache Möglichkeit. Bei FHEM hat das Michael Winkler über einen DNS umgeleiteten TuneIn Sender gemacht (https://mwinkler.jimdo.com/smarthome/sonstiges/amazon-echo-tts-mp3s/)
      Der Aufwand ist allerdings unverhältnismäßig, wenn du eigentlich nur ein Klingeln brauchst.

      Löschen
    2. Vielen Dank, dass hilft mir erst mal weiter. Bzgl. "ALL" wäre es Klasse vordefinierte Gruppen nutzen zu können. Aktuell lasse ich drei verschiedene Echos, je nach Bedarf auch mal nacheinander sprechen. Das geht solange man es nicht zu schnell und zu oft nacheinander macht, sonst kommt "Rate exceeded: Too many requests."

      Löschen
    3. Eine Frage/Bitte hätte ich noch. Ggf. wäre das auch interessant für andere, daher Frage ich es hier an. Ansonsten löse ich das über eine Anpassung des Skripts per sed bevor es ausgeführt wird. Nicht sonderlich elegant, aber dafür musste ich meinen Hack nicht in jede neue Version einbauen.
      Es wäre genial, wenn man die Ansagelautstärke als variable mit übergeben könnte. Hintergrund ist folgenden. Mit der Sonos Api (https://github.com/jishi/node-sonos-http-api) ist es möglich TTS in einer bestimmten Lautstärke auszugeben. Der jeweilige LS fällt danach zurück auf die Ausgangslautstärke. Das war gut nutzbar, um z.B. morgens bzw. abends die Ansagen leiser auszugeben.
      Alexa_remote_control.sh -d "Wohnzimmer Echo" -e speak:"$text" -speakVol:20
      Wird die Lautstärke nicht explizit übergeben. Wird die „SET_SPEAKVOL“ wie konfiguriert verwendet.

      Löschen
    4. Du kannst die meisten Variablen als Umgebungsvariablen (Shell Variable) benutzen:
      SPEAKVOL=20 alexa_remote_control.sh -e speak:hallo

      Die "SET_*" Variablen im Script sollte man nur ändern, wenn sie für jede Ausführung zutreffen.

      Löschen
    5. Das "ALL" device macht nichts anderes als, alle Echo Geräte durchzugehen. Ich schicke allerdings immer ein "sleep 1" zwischen den Aufrufen, um das "Rate exceeded" zu umgehen - das müsstest du für deine eigenen Gruppen also auch machen.

      Löschen
    6. Vielen Dank für den Hinweis. Hätte ich selber drauf kommen müssen!

      Löschen
    7. Du kannst nun auch "-e sound:amzn_sfx_doorbell_01" verwenden.

      Löschen
  8. Hallo Alex!

    Nach kurzer Suche bin ich auf deine Seite gestoßen! Also dein Skript ist genau das was ich suchte, und dafür gebührt dir größter Respekt.

    Ich habe es auch auf eine Synology NAS zum laufen gebracht. Über die Konsole kann ich auch alles bedienen.

    Soweit sogut, (jetzt kommt leider das)aber:

    Auf der selben Synology habe ich auch den xHome Server von xSolution am laufen (Hausautomatisierung), dieser kann HTTP Befehle senden. Ist es möglich dein Skript über einen HTTP Befehl auszulösen? JA - Wie?

    Ich habe mich versucht in die Thematik einzulesen, aber es ist schwierig für mich das zu verstehen.

    Vielleicht kannst du mir Helfen - Vielen Dank im Vorfeld

    LG Herbert

    AntwortenLöschen
    Antworten
    1. Da gibt es wahrscheinlich verschiedene Möglichkeiten. Rein per CGI ginge das z.B. so (setzt einen CGI fähigen Webserver voraus):

      #!/bin/bash
      # webroot/cgi/alexa.cgi
      #

      echo "Conent-type: text/plain
      "

      saveIFS=$IFS
      IFS='=&'
      p=($QUERY_STRING)
      IFS=$saveIFS

      ARG=""
      for ((i=0; i<${#p[@]}; i+=2)) ; do
      ARG="${ARG} -${p[$i]} ${p[$i+1]}"
      done
      /alexa_remote_control.sh $ARG

      Bei deienr Homeautomation Lösung kommst du aber evtl. mit dem "exec" eher ans Ziel: https://xsolution.de/doku_evo/exec.html

      Alex

      Löschen
  9. Hallo,
    wie kann man denn dieses OATHTOOL auf FreeBSD installieren?

    AntwortenLöschen
    Antworten
    1. Bin nicht so der FreeBSD-Freak, aber schau mal hier: https://www.freshports.org/security/oath-toolkit/

      Löschen
  10. Hallo,
    weiß jemand, welche Sounds derzeit funktionieren?
    Wäre super, wenn es hier eine Liste gäbe!
    Vielen Dank

    AntwortenLöschen
    Antworten
    1. https://forum.fhem.de/index.php/topic,82631.msg1022377.html#msg1022377

      Löschen
  11. Hi,

    ich habe das Script um die Funktionen "lastcommand" und "lastcommand for specific device" erweitert.
    Wo kann ich diese Änderungen einreichen?
    Hier per Email oder Git?

    Gruß,

    Trinitus01 - Tom

    AntwortenLöschen
  12. Would be great to have podcast support in Spotify. These streams from TuneIn start with a 'p' instead of 's'

    this is not working: script:///home/pi/domoticz/scripts/alexa_remote_control.sh -d kitchen -r p1006220

    AntwortenLöschen
  13. Hi,
    das Skript ist ziemlich cool und ich überlege wie ich es einbinden kann.
    Problemstellung: Ich habe Smarte LEDs im Schlafzimmer, die ich aber nicht über einen Echo Dot im gleichen Zimmer ansteuern möchte.
    Wie könnte man das lösen? Hat schon mal jemand eine Fernbedienung mit dem Skript gemacht?
    Danke!

    AntwortenLöschen
    Antworten
    1. Mit dem neuen "-e textcommand:'Schalte Lampe Schlafzimmer'" sollte das funktionieren.

      Löschen
  14. Moin.
    Ich habe brav alles durchgelesen und auch jeden Kommentar, aber irgendwie hat mich das auch nicht weiter geholfen.

    Habe alles hinbekommen. Anmeldung mit MFA, Abfrage der Devicelist, auch die Routine die ich ansteuern will habe ich in der .alexa.automation gefunden. Ach und ich nutze das "grosse script".

    "utterance": "schalte den Fernseher ein",
    "locale": "de-DE",

    Allerdings liefert das Script immer wieder folgendes zurück:

    tmp $ alexa_remote_control.sh -d 'Cube' -e automation:'schalte den fernseher ein'
    sending cmd:automation:schalte den fernseher ein to dev:Cube type:XXXXXXXXXXX serial:XXXXXXXXXXXXX customerid:XXXXXXXXXXXXX
    ERROR: no such utterance 'schalte den fernseher ein' in Alexa routines

    (die IDs habe ich mal im Post hier durch XXXXX ersetzt. Sonst sind die natürlich gefüllt.)

    Alles andere wie -e speak:'blabla' funktioniert wunderbar. Nur eben das aufrufen der Routine nicht.

    Ziel der Übung ist es im Homeassistant per Button ein Script aufzurufen, dass eben Dein Shellcommand startet um den Fernseher ein bzw. dann auch wieder auszuschalten. Der TV ist schon etwas älter und nicht selber so intelligent. Der TV und mein Receiver wird also über den Amazon Cube normalerweise durch "Alexa, schalte den Fernseher ein" eingeschaltet. Das funktioniert auch alles wunderbar. Allerdings musste ich erst eine eigene Routine erstellen, damit diese auch in der .alexa.automation erscheint. Normalerweise ist die im default schon nach der Einrichtung des Cubes vorhanden, sollte aber ja keine Rolle spielen.

    Irgendeine Idee wo der Fehler liegen könnte?

    Danke und Gruß
    Benjamin

    AntwortenLöschen
    Antworten
    1. Fehler selber gefunden. Man beachte den Unterschied "Fernseher" mit großem F und fernseher mit kleinem f. Manchmal ist die Lösung so nahe. :)

      Löschen
  15. Hello Alexander,

    your script is great and very helpful. All works perfectly as it should.

    I have a question on a feature: can I ask which radio station is actually played on a device? So if I set a station with -r option but later change it via voice command, how can I get back the station name set by the voice command and actually is running on the device? I checked the output of the existing options but could not find a correlation between output data and station actually played.

    This would be a great extension of your script.
    Or is there something I missed how to do it?

    Regards,
    Horst

    AntwortenLöschen
    Antworten
    1. The only way is to query the echo using '-q'.
      That prints out three JSON data parts. If you only need one, comment the others around line 911.

      Alex

      Löschen
  16. Hallo Alex, danke für das Script, bin nun über das Homematic Forum draufgestossen. Leider hat es mit dem 2fa am Anfang bei mir nicht funktioniert, da der CURL ohne -k (für ignore invalid cert) aufgerufen wird. Somit gehts hinter einer Firewall mit SSL-Decrypt nicht :-) Vielleicht kannst du das ja mal in deinen zukünftigen Versionen einbauen, dann muss das nicht immer nachgezogen werden,

    Danke und Gruß aus Ösiland

    Kilowatt

    AntwortenLöschen
    Antworten
    1. Hallo Wolfgang, ich weiß nicht genau, was du meinst. Standardmäßig kann/möchte ich natürlich nicht auf die Zertifikatsüberprüfung verzichten.
      Wenn du das '-k' benötigst, ohne das Script anpassen zu wollen, kannst du die Umgebungsvariable 'OPTS' setzen, die an CURL weitergereicht wird, z.B.:
      OPTS='-k --compressed --http1.1'
      Alex

      Löschen
  17. Super cooles Script. Kann man hier eigentlich mal für'n Bier spenden oder sowas? :-)

    AntwortenLöschen
  18. Hi! your work is awesome and very cool!!

    I can play your example.

    alexa_remote_control_plain.sh -e "sound:amzn_sfx_trumpet_bugle_04"

    But this is not work

    alexa_remote_control_plain.sh -e "sound:amzn_sfx_trumpet_bugle_01"
    alexa_remote_control_plain.sh -e "sound:amzn_sfx_trumpet_bugle_02"
    alexa_remote_control_plain.sh -e "sound:amzn_sfx_trumpet_bugle_03"

    How can I play other sound?? or play soundbank??

    Thank you!!

    AntwortenLöschen
    Antworten
    1. The "sound" command only lets you use a limited number of sounds, just like when you're creating a routine in the Alexa app.
      You might have more success using the SSML of the "speak" command:

      -e speak:'>audio src="soundbank://soundlibrary/musical/amzn_sfx_trumpet_bugle_03"/<'

      Löschen
    2. I can't edit my comment :) Of course it should be proper XML tags opening and closing.

      Löschen
  19. Hi, for those who are looking for (like me) ... here's how to adjust the volume with the same shell command> export SPEAKVOL=50;alexa_remote_control.sh -d salon -e speak:'salut'

    AntwortenLöschen
  20. seit heute geht -r stationsID nichtmehr... kommt nix ausm echo...:) andere befehle funzen einwandfrei.

    irgndwelche ideen? scheitn ja eine änderung auf amazonseite zu sein...

    AntwortenLöschen
  21. Hello,

    Thank you for all your effort Alexander, I use your config for quiet a while now and it works great!

    I noticed 1 issue since an update from Amazon I think. The adio stations don't work anymore with "./alexa_remote_control.sh -d "Everywhere" -r s0000". I checked the stationID, they where chanced, but even the new stationID's don't work.

    A speak commands like ./alexa_remote_control.sh -d "Everywher e" -e speak:"test" still works.

    Do you know if we have to update your skill?

    AntwortenLöschen
  22. TuneIn is not working anymore. Workaround to use a textcommand also fails: "-e textcommand:'play radio 2000'" Direct voice command "play radio 2000" however still works, when i speak to Alexa. I have tried several commands, like -e textcommand:'play tunein The Rock 902 s25248 new zealand', no juice

    AntwortenLöschen
    Antworten
    1. Amazon deactivated this part of the API. There will be a replacement version soon (end of this week). textcommand is your only hope until then :(

      Löschen
  23. Hallo zusammen. Bin jetzt allen Anleitungen gefolgt, habe aber immer noch das Problem mit dem Captcha. "ERROR: Amazon Login was unsuccessful. Possibly you get a captcha login screen." Bis vor ein paar Wochen lief das System, jetzt aber nicht mehr. Java, Cookies, MFA, oathtool wie hier beschrieben versucht, funktioniert aber nicht. Sonst irgendjemand eine Idee ?

    AntwortenLöschen
  24. somehow my username, password and mfa are all correct but my /tmp/.alexa.login is giving me

    There was a problem
    Your password is incorrect

    Any ideas?

    AntwortenLöschen
    Antworten
    1. well, it works on my docker machine host, but does not work on the docker container for some reason

      Löschen
    2. Some components missing from the container... BASH/SED/AWK/JQ
      Or maybe the password contains some special characters?
      I would assume you're passing the password as an ENV var into the container - maybe something gets substituted there

      Löschen
  25. @alexander

    I want to thank you very much for this script, and all the time you put into it. This is really the icing on the cake for my HC3 setup. It works perfectly!

    AntwortenLöschen