diff --git a/README.md b/README.md index 606d17b..a44e363 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,15 @@ between presets. Switch on/off: -`$ wled -f(nordcenter)|-w(wohnzimmer) on|off` +`$ wled --fnordcenter|--wohnzimmer|--all on|off` Switch between presets 1 to 17 or list available presets: -`$ wled -f|-w 1-17|l` +`$ wled -f|-w|-a [1-17|l(ist)]` Change brightness: -`$ wled -f|-w -b 1-255` +`$ wled -f|-w|-a -b [1-255]` ## Requirements diff --git a/wled b/wled index 5811985..c99a225 100755 --- a/wled +++ b/wled @@ -8,21 +8,22 @@ NAME="wled.sh" COMMAND="wled" -VERSION="0.1.1" +VERSION="0.1.2" print_usage() { echo "\ -Usage: $COMMAND -f(norcenter)|-w(wohnzimmer) [on|off] - $COMMAND -f|-w [1-17|list] - $COMMAND -f|-w -b [1-255]" +Usage: $COMMAND -f(norcenter)|-w(wohnzimmer)|-a(ll) [on|off] + $COMMAND -f|-w|-a [1-17|list] + $COMMAND -f|-w|-a -b [1-255]" } print_help() { print_usage echo " -host selection: +instance selection: -f,--fnordcenter select fnordcenter -w,--wohnzimmer select wohnzimmer + -a,--all select all known instances commands: on|off switch on/off @@ -50,9 +51,16 @@ active_preset() { sed -n 's/.*"ps"[[:space:]]*:[[:space:]]*\(1\?[0-9]\).*/\1/p' } -# Parse host argument. -case "$1" in - ""|-h|--help) # Missing host parameter. +arg_inst="$1" +arg_cmnd="$2" +arg_param="$3" + +# Clear positional arguments. +set -- + +# Parse instance argument and store hostnames as positional arguments. +case "$arg_inst" in + ""|-h|--help) # Missing instance parameter. print_help exit 0 ;; @@ -60,93 +68,94 @@ case "$1" in echo "$NAME version $VERSION" exit 0 ;; + -a|--all) + set -- 'wled-fnordcenter.local' \ + 'wled-wohnzimmer.local' + ;; -f|--fnordcenter) - wled_host='wled-fnordcenter.local' + set -- 'wled-fnordcenter.local' ;; -w|--wohnzimmer) - wled_host='wled-wohnzimmer.local' + set -- 'wled-wohnzimmer.local' ;; - *) # Unknown host parameter. - echo "Error: unknown host \"$1\"." >&2 + *) # Unknown instance parameter. + echo "Error: unknown instance \"$arg_inst\"." >&2 print_usage exit 1 ;; esac -# Parse and execute command argument. -case "$2" in - on) # Switch on. - api_resp=$(curl_send '{"on":true}' "http://$wled_host/json") - ;; - off) # Switch off. - api_resp=$(curl_send '{"on":false}' "http://$wled_host/json") - ;; - -b|--brightness) # Set brightness. - if test -z "$3"; then - echo "Error: missing parameter for brightness." >&2 +# Parse and execute command argument against given instances. +while test $# -gt 0; do + case "$arg_cmnd" in + on) # Switch on. + api_resp=$(curl_send '{"on":true}' "http://$1/json") + ;; + off) # Switch off. + api_resp=$(curl_send '{"on":false}' "http://$1/json") + ;; + -b|--brightness) # Set brightness. + if test -z "$arg_param"; then + echo "Error: missing parameter for brightness." >&2 + exit 1 + fi + # Try to convert 3rd parameter to an integer between 1 an 255. + bright=$(printf '%u' "$arg_param" 2>/dev/null) + if test $? -gt 0; then # Conversion failed. + echo "Error: unable to parse parameter for brightness." >&2 + exit 1 + elif test "$bright" -lt 1 -o "$bright" -gt 255; then + echo "Error: parameter for brightness is out of range." >&2 + exit 1 + fi + api_resp=$(curl_send "{'bri':$bright}" "http://$1/json") + ;; + [1-9]|1[0-7]) # Switch to preset. + api_resp=$(curl_send "{'ps':$arg_cmnd}" "http://$1/json") + ;; + l|list) # List presets. + printf "loading ...\r" + active_ps=$(active_preset "$1") + curl_fetch "http://$1/presets.json" | \ + # Split into lines - one line per preset. + sed --sandbox 's/"1\?[0-9]"[[:space:]]*:/\n&/g' | \ + # Extract number and name of every preset. Right-align numbers. + # Drop everything else. + sed --sandbox -n \ + '/^"\(1\?[0-9]\)"[[:space:]]*:.*"n"[[:space:]]*:[[:space:]]*"\([[:alnum:] _-]*\)".*$/{ + s//\1: \2/ + s/^[0-9]:/ &/ + p + }' | \ + # Sort. + sort -b -n | \ + # Prepend description and mark active preset. + sed --sandbox -e "1i\\Presets on $1:" \ + -e "s/^ \?$active_ps:.*/& */" + ;; + "") # Missing command. + echo "Error: missing command." >&2 + print_usage exit 1 - fi - # Try to convert 3rd parameter to an integer between 1 an 255. - bright=$(printf '%u' "$3" 2>/dev/null) - if test $? -gt 0; then # Conversion failed. - echo "Error: unable to parse parameter for brightness." >&2 + ;; + *) # Unknown command. + echo "Error: unknown command \"$arg_cmnd\"." >&2 + print_usage exit 1 - elif test "$bright" -lt 1 -o "$bright" -gt 255; then - echo "Error: parameter for brightness is out of range." >&2 - exit 1 - fi - api_resp=$(curl_send "{'bri':$bright}" "http://$wled_host/json") - ;; - [1-9]|1[0-7]) # Switch to preset. - api_resp=$(curl_send "{'ps':$2}" "http://$wled_host/json") - ;; - l|list) # List presets. - printf "loading ...\r" - active_ps=$(active_preset "$wled_host") - curl_fetch "http://$wled_host/presets.json" | \ - # Split into lines - one line per preset. - sed --sandbox 's/"1\?[0-9]"[[:space:]]*:/\n&/g' | \ - # Extract number and name of every preset. Right-align numbers. - # Drop everything else. - sed --sandbox -n \ - '/^"\(1\?[0-9]\)"[[:space:]]*:.*"n"[[:space:]]*:[[:space:]]*"\([[:alnum:] _-]*\)".*$/{ - s//\1: \2/ - s/^[0-9]:/ &/ - p - }' | \ - # Sort. - sort -b -n | \ - # Prepend description and mark active preset. - sed --sandbox -e "1i\\Presets on $wled_host:" \ - -e "s/^ \?$active_ps:.*/& */" - exit $? - ;; - dump) # Dump JSON response from API. - curl_fetch -w '\n' "http://$wled_host/json" - exit 0 - ;; - "") # Missing command. - echo "Error: missing command." >&2 - print_usage - exit 1 - ;; - *) # Unknown command. - echo "Error: unknown command \"$2\"." >&2 - print_usage - exit 1 - ;; -esac + ;; + esac -# Check curl exit status -curl_exit=$? -if test $curl_exit -ne 0; then - echo "Error: curl exited with exit code $curl_exit." >&2 - exit 1 -fi + # Check curl exit status + curl_exit=$? + if test $curl_exit -ne 0; then + echo "Error: curl exited with exit code $curl_exit." >&2 + fi -# Check API responce. -if echo "$api_resp" | grep -qv '{\s*"success"\s*:\s*true\s*}'; then - echo "Error: unexpected responce from WLED API." >&2 - exit 1 -fi + # Check API responce. + if test -n "$api_resp" && echo "$api_resp" | grep -qv '{\s*"success"\s*:\s*true\s*}'; then + echo "Warning: unexpected responce from WLED API." >&2 + fi + + shift +done