Creating charts for my UPS metrics - Part 2 Following up from my previous question


  Streaming my UPS metrics for graphical viewing in bash


#!/usr/bin/env bash

[ -v METRICS_CHECK ] &amp;&amp; set -x

API_URL="https://api.thingspeak.com/update"
UPS_PROPS=("LINEV" "LOADPCT" "TIMELEFT")
API_PARAMS=("api_key==XXXXXXXXXXXXXX")

for index in "${!UPS_PROPS[@]}"
do
    value=$(/sbin/apcaccess -up "${UPS_PROPS[$index]}")
    field=$((index + 1))
    if [ "$field" -eq 2 ]
        then
        # bc required for floating point arithmetic
        value=$(echo "$value * 6" | bc)  # 600 Watt * load percent
    fi
    PARAM=$(printf "field%d==%s" "$field" "$value")
    API_PARAMS+=("${PARAM}")
done

/usr/local/bin/http "$API_URL" ${API_PARAMS[@]}


Updates:


Collects data for different metrics supported by apcaccess
Use a variable check for enabling debug mode
Split parameters sent to API URL into a different array
Move away from curl to use httpie
Custom computation for certain attributes




The shellcheck passes everything except the unquoted ${API_PARAMS[@]} in the last line. I am not sure that httpie would work if I quote that and pass it as a single argument.



Charts for viewing pleasure (last 600 minutes data from the time post was created):


Input line voltage


Load (in wattage) on the UPS


Battery time left for the UPS




Click the images to get live charts.
Quoting - you need double-quotes on the last line: it should be "${API_PARAMS[@]}" (remember that the [@] makes the shell expand it into multiple words, so it won't be seen by your http program as just one).

Instead of if [ "$field" -eq 2 ], it's clearer to compare the field name.  That will help if you change the properties list in future.  It may help to create a variable:

propname="${UPS_PROPS[$index]}"
value=$(/sbin/apcaccess -up "$propname")
if [ "$propname" = LOADPCT ]


We can supply standard input from a string without needing an echo process, by using &lt;&lt;&lt; redirection:

    # bc required for floating point arithmetic
    value=$(&lt;&lt;&lt;"$value * 6" bc)  # 600 Watt * load percent


We can make the array 1-based, and avoid the need to have $field different from $index:

UPS_PROPS=([1]="LINEV" "LOADPCT" "TIMELEFT")