X-Git-Url: http://git.vanrenterghem.biz/elgato-keylight-script.git/blobdiff_plain/5ccd9e635588052f6b44fea52419da59a4696660..fd2d087d6958d2475de4b8c18fda0cab93092bbd:/keylights.sh diff --git a/keylights.sh b/keylights.sh index b79b5ad..1dab511 100755 --- a/keylights.sh +++ b/keylights.sh @@ -11,10 +11,11 @@ icon="${script_dir}/assets/elgato.png" declare -i silent=0 declare -i pretty=0 declare action="usage" -declare target="" +declare target='.' declare format="json" declare -A lights declare lights_json +declare simple_json declare flat_json declare call='curl --silent --show-error --location --header "Accept: application/json" --request' declare devices="/elgato/lights" @@ -51,14 +52,15 @@ Available actions: status Get state of lights on Turn all lights on off Turn all lights off - temperature Set temperature level (260-470) + temperature Set temperature level (260-470) brightness Set brightness level (0-100) increase Increases brightness by 10 decrease Decreases brightness by 10 Available formats: json Renders output as JSON (default) - flat Renders output as flattened JSON with .(dot) notation JSON (default) + simple Renders output as JSON array of single level objects with subarrays as .(dot) notation JSON + flat Renders output as fully flattened single level JSON with .(dot) notation JSON html Renders output as basic html table csv Renders output as csv table Renders output as a printed table @@ -142,64 +144,75 @@ produce_json() { t=$(eval echo "'[.[] | select($target)]'") lights_json=$(echo "${lights[@]}" | jq -c -s "$t") -} - -# produce_json() { -# declare json -# t=$(eval echo "'.[] | select($target)'") + simple_json=$(echo "${lights_json}" | jq -c '.[] | reduce ( tostream | select(length==2) | .[0] |= [join(".")] ) as [$p,$v] ({}; setpath($p; $v)) ') + simple_json=$(echo "${simple_json}" | jq -c -s '.') # slurp it to make it an array + flat_json=$(echo "${lights_json}" | jq -c -s '.[] | reduce ( tostream | select(length==2) | .[0] |= [join(".")] ) as [$p,$v] ({}; setpath($p; $v)) ') -# for l in "${!lights[@]}"; do -# json+="${lights[$l]}," -# done +} -# lights_json=$(echo "[${json%,}]" | jq -c "$t") -# } output() { - data=${1-} - type=${2-"$format"} # Mange user requested output format case $format in - json | flat) print_json "$data" ;; - table) print_json "$data" ;; - csv) print_csv "$data" ;; - pair) print_pair "$data" ;; - html) print_html "$data" ;; - -?*) die "Unknown output format (-f/--format): $type" ;; + json) print_json "$lights_json" ;; + simple) print_json "$simple_json" ;; + flat) print_json "$flat_json" ;; + table) print_structured '@tsv' ;; + csv) print_structured '@csv' ;; + pair) print_structured 'pairs' ;; + html) print_html ;; + -?*) die "Unknown output format (-f/--format): $format" ;; esac } print_json() { - # TODO: Evaluate adding jq filtering as filter argument - query="" - - # Deconstruct json and assemble in flattened with .(dot) notation - if [[ $format == "flat" ]]; then - #query='.[]| . as $in | reduce leaf_paths as $path ({}; . + { ($path | map(tostring) | join(".")): $in | getpath($path) })' - #query='. as \$data | [ path(.. | select(scalars|tostring), select($empty_tests)) ] | map({ (map(tostring) | join("$join_char")) : (. as \$path | . = \$data | getpath(\$path)) }) | reduce .[] as \$item ({ }; . + \$item);' - #query='[leaf_paths as $path | {"key": $path | join("."), "value": getpath($path)}] | from_entries' - query='reduce ( tostream | select(length==2) | .[0] |= [join(".")] ) as [$p,$v] ({}; setpath($p; $v))' - else - query='.' - fi # Manage pretty printing if [[ $pretty -eq 1 ]]; then - echo "${1-}" | jq "$query" + echo "${1-}" | jq '.' else - echo "${1-}" | jq -c -M "$query" + echo "${1-}" | jq -c -M '.' fi exit 0 } -print_table() { - bold=$(tput bold) - normal=$(tput sgr0) - message=' - -' - die "To be implemented" +print_structured() { + pp=${2-$pretty} + # Handle csv and table printing + query="(.[0] | keys_unsorted | map(ascii_upcase)), (.[] | [.[]])|${1-@csv}" + + # Handle printing as key value pairs + if [[ ${1} == 'pairs' ]]; then + query='.[] | "--------------",(to_entries[] | [.key, "=", .value] | @tsv)' + fi + + # Manage pretty printing + if [[ $pp -eq 1 ]]; then + echo "${simple_json}" | jq --raw-output "$query" | column -t -s$'\t' | sed -e 's/"//g' + else + echo "${simple_json}" | jq -r "$query" + fi +} + +print_html() { + data=$(print_structured '@csv' 1) + + html=" + + $( + print_header=true + while read d; do + if $print_header; then + echo "" + print_header=false + continue + fi + echo "" + done <<<"${data}" + ) +
${d//,/<\/th>}
${d//,/}
" + echo "$html" } set_state() { @@ -267,13 +280,12 @@ find_lights() { --arg mac "$mac" \ --arg sku "$sku" \ --arg url "$url" \ - --argjson light "$light" \ --argjson cfg "$cfg" \ '{device: $dev, manufacturer: $mf, hostname: $hn, url: $url, ipv4: $ipv4, ipv6: $ipv6, - port: $port, mac: $mac, sku: $sku, light: $light, settings: $cfg}') + port: $port, mac: $mac, sku: $sku, settings: $cfg}') - # Store the light as json - lights["$device"]=$(echo "$info $json" | jq -s '. | add') + # Store the light as json and merge info + light into base object + lights["$device"]=$(echo "$info $light $json" | jq -s '. | add') # Reset for next light as we are processing the last avahi line default_light_properties @@ -290,14 +302,14 @@ dependencies avahi-browse curl notify-send jq find_lights # Fail if we cannot find lights -[[ ${#lights[@]} -eq 0 ]] && die "No lights found" 2 +[[ ${#lights[@]} -eq 0 ]] && die "No lights found" produce_json # Dispatch actions case $action in usage) usage ;; -list) output "${lights_json}" ;; +list) output ;; status) status ;; on) set_state 1 ;; off) set_state 0 ;;