mirror of
https://github.com/thorsten-gehrig/alexa-remote-control.git
synced 2024-11-22 08:49:02 +01:00
Added textcommand which lets you send anything via CLI you would otherwise say to Alexa
This commit is contained in:
parent
3d575c3f4c
commit
3fd647846b
162
README.md
162
README.md
@ -1,80 +1,82 @@
|
|||||||
|
|
||||||
# alexa-remote-control
|
# alexa-remote-control
|
||||||
control Amazon Alexa from command Line
|
control Amazon Alexa from command Line
|
||||||
|
|
||||||
The settings can now be controlled via environment variables.
|
The settings can now be controlled via environment variables.
|
||||||
```
|
```
|
||||||
EMAIL - your login email
|
EMAIL - your login email
|
||||||
PASSWORD - your login password
|
PASSWORD - your login password
|
||||||
BROWSER - the User-Agent your browser sends in the request header
|
BROWSER - the User-Agent your browser sends in the request header
|
||||||
LANGUAGE - the Accept-Language your browser sends in the request header
|
LANGUAGE - the Accept-Language your browser sends in the request header
|
||||||
AMAZON - your Amazon domain
|
AMAZON - your Amazon domain
|
||||||
ALEXA - the URL you would use for the Alexa Web App
|
ALEXA - the URL you would use for the Alexa Web App
|
||||||
CURL - location of your cURL binary
|
CURL - location of your cURL binary
|
||||||
OPTS - any cURL options you require
|
OPTS - any cURL options you require
|
||||||
TMP - location of the temp dir
|
TMP - location of the temp dir
|
||||||
OATHTOOL - command line for oathtool MFA
|
OATHTOOL - command line for oathtool MFA
|
||||||
MFA_SECRET- the MFA secret
|
MFA_SECRET- the MFA secret
|
||||||
SPEAKVOL - the volume for speak messages ( if set to 0, volume levels are left untouched)
|
SPEAKVOL - the volume for speak messages ( if set to 0, volume levels are left untouched)
|
||||||
NORMALVOL - if no current playing volume can be determined, fall back to normal volume
|
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
|
VOLMAXAGE - max. age in minutes before volume is re-read from API
|
||||||
DEVICEVOLNAME - a list of device names with specific volume settings (space separated)
|
DEVICEVOLNAME - a list of device names with specific volume settings (space separated)
|
||||||
DEVICEVOLSPEAK - a list of speak volume levels - matching the devices above
|
DEVICEVOLSPEAK - a list of speak volume levels - matching the devices above
|
||||||
DEVICEVOLNORMAL - a list of normal volume levels- matching the devices above
|
DEVICEVOLNORMAL - a list of normal volume levels- matching the devices above
|
||||||
(current playing volume takes precedence for normal volume)
|
(current playing volume takes precedence for normal volume)
|
||||||
USE_ANNOUNCEMENT_FOR_SPEAK - Announcements can be made to multiple devices, while
|
USE_ANNOUNCEMENT_FOR_SPEAK - Announcements can be made to multiple devices, while
|
||||||
regular SPEAK cannot but the announcement feature has
|
regular SPEAK cannot but the announcement feature has
|
||||||
to be turned on for those devices. Also supports SSML!
|
to be turned on for those devices. Also supports SSML!
|
||||||
```
|
```
|
||||||
You will very likely want to set the language to:
|
You will very likely want to set the language to:
|
||||||
```
|
```
|
||||||
export LANGUAGE='de,en-US;q=0.7,en;q=0.3'
|
export LANGUAGE='de,en-US;q=0.7,en;q=0.3'
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
alexa-remote-control [-d <device>|ALL] -e <pause|play|next|prev|fwd|rwd|shuffle|repeat|vol:<0-100>> |
|
alexa-remote-control [-d <device>|ALL] -e <pause|play|next|prev|fwd|rwd|shuffle|repeat|vol:<0-100>> |
|
||||||
-b [list|<"AA:BB:CC:DD:EE:FF">] | -q | -n | -r <"station name"|stationid> |
|
-b [list|<"AA:BB:CC:DD:EE:FF">] | -q | -n | -r <"station name"|stationid> |
|
||||||
-s <trackID|'Artist' 'Album'> | -t <ASIN> | -u <seedID> | -v <queueID> |
|
-s <trackID|'Artist' 'Album'> | -t <ASIN> | -u <seedID> | -v <queueID> |
|
||||||
-w <playlistId> | -i | -p | -P | -S | -a | -z | -l | -h |
|
-w <playlistId> | -i | -p | -P | -S | -a | -z | -l | -h |
|
||||||
-m <multiroom_device> [device_1 .. device_X] | -lastalexa | -lastcommand
|
-m <multiroom_device> [device_1 .. device_X] | -lastalexa | -lastcommand
|
||||||
|
|
||||||
-e : run command, additional SEQUENCECMDs:
|
-e : run command, additional SEQUENCECMDs:
|
||||||
weather,traffic,flashbriefing,goodmorning,singasong,tellstory,
|
weather,traffic,flashbriefing,goodmorning,singasong,tellstory,
|
||||||
speak:'<text/ssml>',automation:'<routine name>,sound:<soundeffect_name>'
|
speak:'<text/ssml>',automation:'<routine name>',sound:<soundeffect_name>,
|
||||||
-b : connect/disconnect/list bluetooth device
|
textcommand:'<anything you would say to Alexa otherwise>'
|
||||||
-q : query queue
|
|
||||||
-n : query notifications
|
-b : connect/disconnect/list bluetooth device
|
||||||
-r : play tunein radio
|
-q : query queue
|
||||||
-s : play library track/library album
|
-n : query notifications
|
||||||
-t : play Prime playlist
|
-r : play tunein radio
|
||||||
-u : play Prime station
|
-s : play library track/library album
|
||||||
-v : play Prime historical queue
|
-t : play Prime playlist
|
||||||
-w : play library playlist
|
-u : play Prime station
|
||||||
-i : list imported library tracks
|
-v : play Prime historical queue
|
||||||
-p : list purchased library tracks
|
-w : play library playlist
|
||||||
-P : list Prime playlists
|
-i : list imported library tracks
|
||||||
-S : list Prime stations
|
-p : list purchased library tracks
|
||||||
-a : list available devices
|
-P : list Prime playlists
|
||||||
-m : delete multiroom and/or create new multiroom containing devices
|
-S : list Prime stations
|
||||||
-lastalexa : print device that received the last voice command
|
-a : list available devices
|
||||||
-lastcommand : print last voice command or last voice command of specific device
|
-m : delete multiroom and/or create new multiroom containing devices
|
||||||
-login : Logs in, without further command (downloads cookie)
|
-lastalexa : print device that received the last voice command
|
||||||
-z : print current volume level
|
-lastcommand : print last voice command or last voice command of specific device
|
||||||
-l : logoff
|
-login : Logs in, without further command (downloads cookie)
|
||||||
-h : help
|
-z : print current volume level
|
||||||
```
|
-l : logoff
|
||||||
|
-h : help
|
||||||
There's also a "plain" version, which lacks some functionality (-z, -i, -p, -P, -S and no radio station names and no routines) but doesn't require 'jq' for JSON processing.
|
```
|
||||||
|
|
||||||
In order to use MFA, one needs to obtain the MFA_SECRET from Amazon account:
|
There's also a "plain" version, which lacks some functionality (-z, -i, -p, -P, -S and no radio station names and no routines) but doesn't require 'jq' for JSON processing.
|
||||||
1. You should have MFA using an App already working before proceeding
|
|
||||||
1. Add a new app
|
In order to use MFA, one needs to obtain the MFA_SECRET from Amazon account:
|
||||||
1. When presented with the QR-code select "can't scan code"
|
1. You should have MFA using an App already working before proceeding
|
||||||
1. You will be presented with the MFA shared secret, something like `1234 5678 9ABC DEFG HIJK LMNO PQRS TUVW XYZ0 1234 5678 9ABC DEFG`
|
1. Add a new app
|
||||||
1. Now you have to generate a valid response code via `oathtool -b --totp "<MFA shared secret from above>"` and enter that in the web form
|
1. When presented with the QR-code select "can't scan code"
|
||||||
1. Going from here the MFA shared secret becomes the MFA_SECRET for the alexa_remote_control script
|
1. You will be presented with the MFA shared secret, something like `1234 5678 9ABC DEFG HIJK LMNO PQRS TUVW XYZ0 1234 5678 9ABC DEFG`
|
||||||
*Treat that MFA_SCECRET just like your password - DO NOT share it anywhere!!!*
|
1. Now you have to generate a valid response code via `oathtool -b --totp "<MFA shared secret from above>"` and enter that in the web form
|
||||||
|
1. Going from here the MFA shared secret becomes the MFA_SECRET for the alexa_remote_control script
|
||||||
It is assumed that MFA secured accounts are less likely to get a captcha response during login - that's why MFA might yield better results if the plain username/password didn't work for you.
|
*Treat that MFA_SCECRET just like your password - DO NOT share it anywhere!!!*
|
||||||
|
|
||||||
http://blog.loetzimmer.de/2017/10/amazon-alexa-hort-auf-die-shell-echo.html
|
It is assumed that MFA secured accounts are less likely to get a captcha response during login - that's why MFA might yield better results if the plain username/password didn't work for you.
|
||||||
|
|
||||||
|
http://blog.loetzimmer.de/2017/10/amazon-alexa-hort-auf-die-shell-echo.html
|
||||||
|
@ -57,6 +57,8 @@
|
|||||||
# 2020-06-15: v0.16b added "lastcommand" option
|
# 2020-06-15: v0.16b added "lastcommand" option
|
||||||
# (thanks to Trinitus01 https://github.com/trinitus01)
|
# (thanks to Trinitus01 https://github.com/trinitus01)
|
||||||
# 2020-07-07: v0.16c fixed NORMALVOL if USE_ANNOUNCEMENT_FOR_SPEAK is set
|
# 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 )
|
||||||
#
|
#
|
||||||
###
|
###
|
||||||
#
|
#
|
||||||
@ -186,7 +188,8 @@ usage()
|
|||||||
echo
|
echo
|
||||||
echo " -e : run command, additional SEQUENCECMDs:"
|
echo " -e : run command, additional SEQUENCECMDs:"
|
||||||
echo " weather,traffic,flashbriefing,goodmorning,singasong,tellstory,"
|
echo " weather,traffic,flashbriefing,goodmorning,singasong,tellstory,"
|
||||||
echo " speak:'<text/ssml>',automation:'<routine name>',sound:<soundeffect_name>"
|
echo " speak:'<text/ssml>',automation:'<routine name>',sound:<soundeffect_name>,"
|
||||||
|
echo " textcommand:'<anything you would otherwise say to Alexa>'"
|
||||||
echo " -b : connect/disconnect/list bluetooth device"
|
echo " -b : connect/disconnect/list bluetooth device"
|
||||||
echo " -q : query queue"
|
echo " -q : query queue"
|
||||||
echo " -n : query notifications"
|
echo " -n : query notifications"
|
||||||
@ -213,7 +216,7 @@ usage()
|
|||||||
while [ "$#" -gt 0 ] ; do
|
while [ "$#" -gt 0 ] ; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--version)
|
--version)
|
||||||
echo "v0.16a"
|
echo "v0.17"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
-d)
|
-d)
|
||||||
@ -410,6 +413,11 @@ case "$COMMAND" in
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
textcommand:*)
|
||||||
|
SEQUENCECMD='Alexa.TextCommand\",\"skillId\":\"amzn1.ask.1p.tellalexa'
|
||||||
|
SEQUENCEVAL=$(echo ${COMMAND##textcommand:} | sed -r s/\"/\'/g)
|
||||||
|
SEQUENCEVAL=',\"text\":\"'${SEQUENCEVAL}'\"'
|
||||||
|
;;
|
||||||
speak:*)
|
speak:*)
|
||||||
TTS=$(echo ${COMMAND##speak:} | sed -r s/\"/\'/g)
|
TTS=$(echo ${COMMAND##speak:} | sed -r s/\"/\'/g)
|
||||||
if [ $USE_ANNOUNCEMENT_FOR_SPEAK -gt 0 ] ; then
|
if [ $USE_ANNOUNCEMENT_FOR_SPEAK -gt 0 ] ; then
|
||||||
@ -650,7 +658,7 @@ if [ -n "${SEQUENCECMD}" ] ; then
|
|||||||
ALEXACMD='{"behaviorId":"'${AUTOMATION}'","sequenceJson":"'${SEQUENCE}'","status":"ENABLED"}'
|
ALEXACMD='{"behaviorId":"'${AUTOMATION}'","sequenceJson":"'${SEQUENCE}'","status":"ENABLED"}'
|
||||||
else
|
else
|
||||||
# SequenceCommands are generally not supported on WHA devices
|
# SequenceCommands are generally not supported on WHA devices
|
||||||
if echo $COMMAND | grep -q -E "weather|traffic|flashbriefing|goodmorning|singasong|tellstory|sound" ; then
|
if echo $COMMAND | grep -q -E "weather|traffic|flashbriefing|goodmorning|singasong|tellstory|sound|textcommand" ; then
|
||||||
if [ "${DEVICEFAMILY}" = "WHA" ] ; then
|
if [ "${DEVICEFAMILY}" = "WHA" ] ; then
|
||||||
echo "Skipping unsupported command: ${COMMAND} on dev:${DEVICE} type:${DEVICETYPE} serial:${DEVICESERIALNUMBER} family:${DEVICEFAMILY}"
|
echo "Skipping unsupported command: ${COMMAND} on dev:${DEVICE} type:${DEVICETYPE} serial:${DEVICESERIALNUMBER} family:${DEVICEFAMILY}"
|
||||||
return
|
return
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
# Amazon Alexa Remote Control (PLAIN shell)
|
# Amazon Alexa Remote Control (PLAIN shell)
|
||||||
# alex(at)loetzimmer.de
|
# alex(at)loetzimmer.de
|
||||||
#
|
#
|
||||||
# 2020-07-07: v0.16c (for updates see http://blog.loetzimmer.de/2017/10/amazon-alexa-hort-auf-die-shell-echo.html)
|
# 2020-12-12: v0.17 (for updates see http://blog.loetzimmer.de/2017/10/amazon-alexa-hort-auf-die-shell-echo.html)
|
||||||
#
|
#
|
||||||
###
|
###
|
||||||
#
|
#
|
||||||
@ -57,7 +57,7 @@ SET_SPEAKVOL="0"
|
|||||||
SET_NORMALVOL="10"
|
SET_NORMALVOL="10"
|
||||||
|
|
||||||
# Device specific volumes (overriding the above)
|
# Device specific volumes (overriding the above)
|
||||||
SET_DEVICEVOLNAME="EchoDot2ndGen Echo1stGen"
|
SET_DEVICEVOLNAME="EchoDot2ndGen Echo1stGen"
|
||||||
SET_DEVICEVOLSPEAK="100 30"
|
SET_DEVICEVOLSPEAK="100 30"
|
||||||
SET_DEVICEVOLNORMAL="100 20"
|
SET_DEVICEVOLNORMAL="100 20"
|
||||||
|
|
||||||
@ -121,7 +121,8 @@ usage()
|
|||||||
echo
|
echo
|
||||||
echo " -e : run command, additional SEQUENCECMDs:"
|
echo " -e : run command, additional SEQUENCECMDs:"
|
||||||
echo " weather,traffic,flashbriefing,goodmorning,singasong,tellstory,"
|
echo " weather,traffic,flashbriefing,goodmorning,singasong,tellstory,"
|
||||||
echo " speak:'<text>'sound:<soundeffect_name>"
|
echo " speak:'<text>',sound:<soundeffect_name>,"
|
||||||
|
echo " textcommand:'<anything you would otherwise say to Alexa>'"
|
||||||
echo " -b : connect/disconnect/list bluetooth device"
|
echo " -b : connect/disconnect/list bluetooth device"
|
||||||
echo " -q : query queue"
|
echo " -q : query queue"
|
||||||
echo " -n : query notifications"
|
echo " -n : query notifications"
|
||||||
@ -142,7 +143,7 @@ usage()
|
|||||||
while [ "$#" -gt 0 ] ; do
|
while [ "$#" -gt 0 ] ; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--version)
|
--version)
|
||||||
echo "v0.16a"
|
echo "v0.17"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
-d)
|
-d)
|
||||||
@ -321,6 +322,11 @@ case "$COMMAND" in
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
textcommand:*)
|
||||||
|
SEQUENCECMD='Alexa.TextCommand\",\"skillId\":\"amzn1.ask.1p.tellalexa'
|
||||||
|
SEQUENCEVAL=$(echo ${COMMAND##textcommand:} | sed -r s/\"/\'/g)
|
||||||
|
SEQUENCEVAL=',\"text\":\"'${SEQUENCEVAL}'\"'
|
||||||
|
;;
|
||||||
speak:*)
|
speak:*)
|
||||||
TTS=$(echo ${COMMAND##*:} | sed -r 's/["\\]/ /g')
|
TTS=$(echo ${COMMAND##*:} | sed -r 's/["\\]/ /g')
|
||||||
TTS=',\"textToSpeak\":\"'${TTS}'\"'
|
TTS=',\"textToSpeak\":\"'${TTS}'\"'
|
||||||
@ -625,7 +631,7 @@ set_var()
|
|||||||
run_cmd()
|
run_cmd()
|
||||||
{
|
{
|
||||||
if [ -n "${SEQUENCECMD}" ] ; then
|
if [ -n "${SEQUENCECMD}" ] ; then
|
||||||
if echo $COMMAND | grep -q -E "weather|traffic|flashbriefing|goodmorning|singasong|tellstory|speak|sound" ; then
|
if echo $COMMAND | grep -q -E "weather|traffic|flashbriefing|goodmorning|singasong|tellstory|speak|sound|textcommand" ; then
|
||||||
if [ "${DEVICEFAMILY}" = "WHA" ] ; then
|
if [ "${DEVICEFAMILY}" = "WHA" ] ; then
|
||||||
echo "Skipping unsupported command: ${COMMAND} on dev:${DEVICE} type:${DEVICETYPE} serial:${DEVICESERIALNUMBER} family:${DEVICEFAMILY}"
|
echo "Skipping unsupported command: ${COMMAND} on dev:${DEVICE} type:${DEVICETYPE} serial:${DEVICESERIALNUMBER} family:${DEVICEFAMILY}"
|
||||||
return
|
return
|
||||||
|
Loading…
Reference in New Issue
Block a user