Skip to content

Commit

Permalink
Merge pull request #354 from gavink97/main
Browse files Browse the repository at this point in the history
Created a new segment to track Air Quality "Air"
  • Loading branch information
erikw authored Jan 23, 2024
2 parents c10d55d + 387c6b5 commit b0063ed
Show file tree
Hide file tree
Showing 5 changed files with 328 additions and 0 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,4 @@ Skywarth <[email protected]>
Drew Daniels <[email protected]>
Danfeng Shan <[email protected]>
Abraham Nuñez <[email protected]>
Gavin Kondrath <[email protected]>
313 changes: 313 additions & 0 deletions segments/air.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER_DEFAULT="openweather"
TMUX_POWERLINE_SEG_AIR_JSON_DEFAULT="jq"
TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD_DEFAULT="600"

generate_segmentrc() {
read -d '' rccontents << EORC
# The data provider to use. Currently only "openweather" is supported.
export TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER="${TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER_DEFAULT}"
# How often to update the weather in seconds.
export TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD="${TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD_DEFAULT}"
# Location of the JSON parser, jq
export TMUX_POWERLINE_SEG_AIR_JSON="${TMUX_POWERLINE_SEG_AIR_JSON_DEFAULT}"
# Your location
# Latitude and Longitude:
TMUX_POWERLINE_SEG_AIR_LAT=""
TMUX_POWERLINE_SEG_AIR_LON=""
# Your Open Weather API Key:
TMUX_POWERLINE_SEG_AIR_OPEN_WEATHER_API_KEY=""
EORC
echo "$rccontents"
}

run_segment() {
__process_settings
local tmp_file="${TMUX_POWERLINE_DIR_TEMPORARY}/temp_air_file.txt"
local air
case "$TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER" in
"openweather") air=$(__openweather);;
*)
echo "Unknown weather provider [${$TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER}]";
return 1
esac
trimmed_air=$(echo "$air" | cut -d' ' -f1-3)

if [ -n "$trimmed_air" ]; then
echo "$trimmed_air"
fi
}

__process_settings() {
if [ -z "$TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER" ]; then
export TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER="${TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER_DEFAULT}"
fi
if [ -z "$TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD" ]; then
export TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD="${TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD_DEFAULT}"
fi
if [ -z "$TMUX_POWERLINE_SEG_AIR_JSON" ]; then
export TMUX_POWERLINE_SEG_AIR_JSON="${TMUX_POWERLINE_SEG_AIR_JSON_DEFAULT}"
fi
if [ -z "$TMUX_POWERLINE_SEG_AIR_LAT" ] && [ -z "$TMUX_POWERLINE_SEG_AIR_LON" ]; then
echo "No location defined.";
exit 8
fi
if [-z "$TMUX_POWERLINE_SEG_AIR_OPEN_WEATHER_API_KEY" ]; then
echo "No API Key defined.";
exit 8
fi
}

__openweather() {
carbon_monoxide=""
if [ -f "$tmp_file" ]; then
if shell_is_osx || shell_is_bsd; then
last_update=$(stat -f "%m" ${tmp_file})
elif shell_is_linux; then
last_update=$(stat -c "%Y" ${tmp_file})
fi
time_now=$(date +%s)

up_to_date=$(echo "(${time_now}-${last_update}) < ${TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD}" | bc)
if [ "$up_to_date" -eq 1 ]; then
__read_tmp_file
fi
fi

if [ -z "$carbon_monoxide" ]; then
air_quality_data=$(curl --max-time 4 -s "http://api.openweathermap.org/data/2.5/air_pollution?lat=${TMUX_POWERLINE_SEG_AIR_LAT}&lon=${TMUX_POWERLINE_SEG_AIR_LON}&appid=${TMUX_POWERLINE_SEG_AIR_OPEN_WEATHER_API_KEY}")
if [ "$?" -eq "0" ]; then
error=$(echo "$air_quality_data" | $grep -i "error");
if [ -n "$error" ]; then
echo "error"
exit 1
fi

jsonparser="${TMUX_POWERLINE_SEG_AIR_JSON}"
carbon_monoxide=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.co)
nitrogen_dioxide=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.no2)
ozone=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.o3)
sulphur_dioxide=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.so2)
fine_particle_matter=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.pm2_5)
coarse_particulate_matter=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.pm10)

elif [ -f "${tmp_file}" ]; then
__read_tmp_file
fi
fi

if [ -n "$carbon_monoxide" ]; then
__get_us_aqi_score "$carbon_monoxide" "$nitrogen_dioxide" "$ozone" "$sulphur_dioxide" "$fine_particle_matter" "$coarse_particulate_matter"
fi
}

__get_us_aqi_score() {
local carbon_monoxide=$1
local nitrogen_dioxide=$2
local ozone=$3
local sulphur_dioxide=$4
local fine_particle_matter=$5
local coarse_particulate_matter=$6

carbon_monoxide_ppm=$(__convert_uqgm3_ppm "$carbon_monoxide")
nitrogen_dioxide_ppb=$(__convert_uqgm3_ppb "$nitrogen_dioxide" "46.01")
ozone_ppb=$(__convert_uqgm3_ppb "$ozone" "48.00")
sulphur_dioxide_ppb=$(__convert_uqgm3_ppb "$sulphur_dioxide" "64.06")

# CO ppm (8-hr)
if (( $(echo "$carbon_monoxide_ppm < 4.5" | bc -l) )); then
carbon_monoxide_aqi_value=$(echo "scale=3; (50/4.4) * $carbon_monoxide_ppm" | bc -l)
elif (( $(echo "$carbon_monoxide_ppm < 9.5" | bc -l) )); then
carbon_monoxide_aqi_value=$(echo "scale=3; (49/4.9) * ($carbon_monoxide_ppm - 4.5) + 51" | bc -l)
elif (( $(echo "$carbon_monoxide_ppm < 12.5" | bc -l) )); then
carbon_monoxide_aqi_value=$(echo "scale=3; (49/2.9) * ($carbon_monoxide_ppm - 9.5) + 101" | bc -l)
elif (( $(echo "$carbon_monoxide_ppm < 15.5" | bc -l) )); then
carbon_monoxide_aqi_value=$(echo "scale=3; (49/2.9) * ($carbon_monoxide_ppm - 12.5) + 151" | bc -l)
elif (( $(echo "$carbon_monoxide_ppm < 30.5" | bc -l) )); then
carbon_monoxide_aqi_value=$(echo "scale=3; (99/14.9) * ($carbon_monoxide_ppm - 15.5) + 201" | bc -l)
elif (( $(echo "$carbon_monoxide_ppm < 40.5" | bc -l) )); then
carbon_monoxide_aqi_value=$(echo "scale=3; (99/9.9) * ($carbon_monoxide_ppm - 30.5) + 301" | bc -l)
elif (( $(echo "$carbon_monoxide_ppm < 50.5" | bc -l) )); then
carbon_monoxide_aqi_value=$(echo "scale=3; (99/9.9) * ($carbon_monoxide_ppm - 40.5) + 401" | bc -l)
fi

# NO2 ppb (1-hr)
if (( $(echo "$nitrogen_dioxide_ppb < 54" | bc -l) )); then
nitrogen_dioxide_aqi_value=$(echo "scale=3; (50/53) * $nitrogen_dioxide_ppb" | bc -l)
elif (( $(echo "$nitrogen_dioxide_ppb < 101" | bc -l) )); then
nitrogen_dioxide_aqi_value=$(echo "scale=3; (49/46) * ($nitrogen_dioxide_ppb - 54) + 51" | bc -l)
elif (( $(echo "$nitrogen_dioxide_ppb < 361" | bc -l) )); then
nitrogen_dioxide_aqi_value=$(echo "scale=3; (49/259) * ($nitrogen_dioxide_ppb - 101) + 101" | bc -l)
elif (( $(echo "$nitrogen_dioxide_ppb < 650" | bc -l) )); then
nitrogen_dioxide_aqi_value=$(echo "scale=3; (49/288) * ($nitrogen_dioxide_ppb - 361) + 151" | bc -l)
elif (( $(echo "$nitrogen_dioxide_ppb < 1250" | bc -l) )); then
nitrogen_dioxide_aqi_value=$(echo "scale=3; (99/599) * ($nitrogen_dioxide_ppb - 650) + 201" | bc -l)
elif (( $(echo "$nitrogen_dioxide_ppb < 1650" | bc -l) )); then
nitrogen_dioxide_aqi_value=$(echo "scale=3; (99/399) * ($nitrogen_dioxide_ppb - 1250) + 301" | bc -l)
elif (( $(echo "$nitrogen_dioxide_ppb < 2050" | bc -l) )); then
nitrogen_dioxide_aqi_value=$(echo "scale=3; (99/399) * ($nitrogen_dioxide_ppb - 1650) + 401" | bc -l)
fi

# O3 ppb (8-hr)
if (( $(echo "$ozone_ppb < 55" | bc -l) )); then
ozone_aqi_value=$(echo "scale=3; (50/54) * $ozone_ppb" | bc -l)
elif (( $(echo "$ozone_ppb < 71" | bc -l) )); then
ozone_aqi_value=$(echo "scale=3; (49/15) * ($ozone_ppb - 55) + 51" | bc -l)
elif (( $(echo "$ozone_ppb < 86" | bc -l) )); then
ozone_aqi_value=$(echo "scale=3; (49/14) * ($ozone_ppb - 71) + 101" | bc -l)
elif (( $(echo "$ozone_ppb < 106" | bc -l) )); then
ozone_aqi_value=$(echo "scale=3; (49/19) * ($ozone_ppb - 86) + 151" | bc -l)
elif (( $(echo "$ozone_ppb < 201" | bc -l) )); then
ozone_aqi_value=$(echo "scale=3; (99/94) * ($ozone_ppb - 106) + 201" | bc -l)
fi

# SO2 ppb (1-hr)
if (( $(echo "$sulphur_dioxide_ppb < 36" | bc -l) )); then
sulphur_dioxide_aqi_value=$(echo "scale=3; (50/35) * $sulphur_dioxide_ppb" | bc -l)
elif (( $(echo "$sulphur_dioxide_ppb < 76" | bc -l) )); then
sulphur_dioxide_aqi_value=$(echo "scale=3; (49/39) * ($sulphur_dioxide_ppb - 36) + 51" | bc -l)
elif (( $(echo "$sulphur_dioxide_ppb < 186" | bc -l) )); then
sulphur_dioxide_aqi_value=$(echo "scale=3; (49/109) * ($sulphur_dioxide_ppb - 76) + 101" | bc -l)
elif (( $(echo "$sulphur_dioxide_ppb < 305" | bc -l) )); then
sulphur_dioxide_aqi_value=$(echo "scale=3; (49/118) * ($sulphur_dioxide_ppb - 186) + 151" | bc -l)
elif (( $(echo "$sulphur_dioxide_ppb < 605" | bc -l) )); then
sulphur_dioxide_aqi_value=$(echo "scale=3; (99/299) * ($sulphur_dioxide_ppb - 305) + 201" | bc -l)
elif (( $(echo "$sulphur_dioxide_ppb < 805" | bc -l) )); then
sulphur_dioxide_aqi_value=$(echo "scale=3; (99/199) * ($sulphur_dioxide_ppb - 605) + 301" | bc -l)
elif (( $(echo "$sulphur_dioxide_ppb < 1005" | bc -l) )); then
sulphur_dioxide_aqi_value=$(echo "scale=3; (99/199) * ($sulphur_dioxide_ppb - 805) + 401" | bc -l)
fi

# PM2.5 (24-hr)
if (( $(echo "$fine_particle_matter < 12.1" | bc -l) )); then
fine_particle_aqi_value=$(echo "scale=3; (50/12) * $fine_particle_matter" | bc -l)
elif (( $(echo "$fine_particle_matter < 35.5" | bc -l) )); then
fine_particle_aqi_value=$(echo "scale=3; (49/23.3) * ($fine_particle_matter - 12.1) + 51" | bc -l)
elif (( $(echo "$fine_particle_matter < 55.5" | bc -l) )); then
fine_particle_aqi_value=$(echo "scale=3; (49/19.9) * ($fine_particle_matter - 35.5) + 101" | bc -l)
elif (( $(echo "$fine_particle_matter < 150.5" | bc -l) )); then
fine_particle_aqi_value=$(echo "scale=3; (49/94.9) * ($fine_particle_matter - 55.5) + 151" | bc -l)
elif (( $(echo "$fine_particle_matter < 250.5" | bc -l) )); then
fine_particle_aqi_value=$(echo "scale=3; (99/99.9) * ($fine_particle_matter - 150.5) + 201" | bc -l)
elif (( $(echo "$fine_particle_matter < 350.5" | bc -l) )); then
fine_particle_aqi_value=$(echo "scale=3; (99/99.9) * ($fine_particle_matter - 250.5) + 301" | bc -l)
elif (( $(echo "$fine_particle_matter < 500.5" | bc -l) )); then
fine_particle_aqi_value=$(echo "scale=3; (99/149.9) * ($fine_particle_matter - 350.5) + 401" | bc -l)
fi

# PM10 (24-hr)
if (( $(echo "$coarse_particulate_matter < 55" | bc -l) )); then
coarse_particulate_aqi_value=$(echo "scale=3; (50/54) * $coarse_particulate_matter" | bc -l)
elif (( $(echo "$coarse_particulate_matter < 155" | bc -l) )); then
coarse_particulate_aqi_value=$(echo "scale=3; (49/99) * ($coarse_particulate_matter - 55) + 51" | bc -l)
elif (( $(echo "$coarse_particulate_matter < 255" | bc -l) )); then
coarse_particulate_aqi_value=$(echo "scale=3; (49/99) * ($coarse_particulate_matter - 155) + 101" | bc -l)
elif (( $(echo "$coarse_particulate_matter < 355" | bc -l) )); then
coarse_particulate_aqi_value=$(echo "scale=3; (49/99) * ($coarse_particulate_matter - 255) + 151" | bc -l)
elif (( $(echo "$coarse_particulate_matter < 425" | bc -l) )); then
coarse_particulate_aqi_value=$(echo "scale=3; (99/69) * ($coarse_particulate_matter - 355) + 201" | bc -l)
elif (( $(echo "$coarse_particulate_matter < 505" | bc -l) )); then
coarse_particulate_aqi_value=$(echo "scale=3; (99/79) * ($coarse_particulate_matter - 425) + 301" | bc -l)
elif (( $(echo "$coarse_particulate_matter < 605" | bc -l) )); then
coarse_particulate_aqi_value=$(echo "scale=3; (99/99) * ($coarse_particulate_matter - 505) + 401" | bc -l)
fi

aqi_value=$(__get_aqi_max "$carbon_monoxide_aqi_value" "$nitrogen_dioxide_aqi_value" "$ozone_aqi_value" "$sulphur_dioxide_aqi_value" "$fine_particle_aqi_value" "$coarse_particulate_aqi_value")
IFS=' ' read -r aqi_level aqi_color aqi_symbol <<< "$(__get_aqi_level_color_symbol "$aqi_value")"
rounded_aqi=$(printf '%.*f\n' 0 "$aqi_value")

echo "${rounded_aqi} AQI ${aqi_symbol}" "${aqi_color}" | tee "${tmp_file}"
}

__convert_uqgm3_ppm(){
local uqm3=$1

ppm=$(echo "scale=3; $uqm3 / 1000" | bc)

echo $ppm
}

__convert_uqgm3_ppb(){
local uqm3=$1
local molecular_weight=$2

ppb=$(echo "scale=3; ($uqm3 * 24.45) / $molecular_weight" | bc)

echo $ppb
}

__get_aqi_max(){
local n1=$1
local n2=$2
local n3=$3
local n4=$4
local n5=$5
local n6=$6

max=$n1

if (( $(echo "$n2 > $max" | bc -l) )); then
max=$n2
fi

if (( $(echo "$n3 > $max" | bc -l) )); then
max=$n3
fi

if (( $(echo "$n4 > $max" | bc -l) )); then
max=$n4
fi

if (( $(echo "$n5 > $max" | bc -l) )); then
max=$n5
fi

if (( $(echo "$n6 > $max" | bc -l) )); then
max=$n6
fi

echo $max
}

__get_aqi_level_color_symbol(){
local aqi_value=$1

if (( $(echo "$aqi_value < 51" | bc -l) )); then
aqi_level="Good"
aqi_color="#8da101" # Green
aqi_symbol="😊"
elif (( $(echo "$aqi_value < 101" | bc -l) )); then
aqi_level="Moderate"
aqi_color="#dfa000" # Yellow
aqi_symbol="😐"
elif (( $(echo "$aqi_value < 151" | bc -l) )); then
aqi_level="Unhealthy for sensitive groups"
aqi_color="#f57d26" # Orange
aqi_symbol="🙁"
elif (( $(echo "$aqi_value < 201" | bc -l) )); then
aqi_level="Unhealthy"
aqi_color="#f85552" # Red
aqi_symbol="😷"
elif (( $(echo "$aqi_value < 301" | bc -l) )); then
aqi_level="Very unhealthy"
aqi_color="#df69ba" # Purple
aqi_symbol="😨"
elif (( $(echo "$aqi_value < 501" | bc -l) )); then
aqi_level="Hazardous"
aqi_color="#542d2c" # Maroon
aqi_symbol="🛑"
elif (( $(echo "$aqi_value < 1001" | bc -l) )); then
aqi_level="Very Hazardous"
aqi_color="#66401a" # Brown
aqi_symbol="💀"
fi

echo $aqi_level $aqi_color $aqi_symbol
}

__read_tmp_file() {
if [ ! -f "$tmp_file" ]; then
return
fi
cat "${tmp_file}"
exit
}
10 changes: 10 additions & 0 deletions segments/air_color.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
TMUX_POWERLINE_DIR_TEMPORARY="/tmp/tmux-powerline_${USER}"
air_temp_file="${TMUX_POWERLINE_DIR_TEMPORARY}/temp_air_file.txt"

if [ -n $air_temp_file ]; then
TMUX_POWERLINE_SEG_AIR_COLOR=$(awk '{print $NF}' $air_temp_file)
fi

TMUX_POWERLINE_SEG_AIR_COLOR="${TMUX_POWERLINE_SEG_AIR_COLOR:-'37'}"

echo "$TMUX_POWERLINE_SEG_AIR_COLOR"
2 changes: 2 additions & 0 deletions themes/bubble.sh
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ TMUX_POWERLINE_SEPARATOR_THIN="|"

TMUX_POWERLINE_DEFAULT_BACKGROUND_COLOR=${TMUX_POWERLINE_DEFAULT_BACKGROUND_COLOR:-$thm_bg}
TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR=${TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR:-$thm_fg}
TMUX_POWERLINE_SEG_AIR_COLOR=$("${TMUX_POWERLINE_DIR_HOME}/segments/air_color.sh")

TMUX_POWERLINE_DEFAULT_LEFTSIDE_SEPARATOR=${TMUX_POWERLINE_DEFAULT_LEFTSIDE_SEPARATOR:-$TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD}
TMUX_POWERLINE_DEFAULT_RIGHTSIDE_SEPARATOR=${TMUX_POWERLINE_DEFAULT_RIGHTSIDE_SEPARATOR:-$TMUX_POWERLINE_SEPARATOR_LEFT_BOLD}
Expand Down Expand Up @@ -130,6 +131,7 @@ if [ -z $TMUX_POWERLINE_LEFT_STATUS_SEGMENTS ]; then
"lan_ip $sky_blue $thm_bg ${TMUX_POWERLINE_SEPARATOR_RIGHT_THIN}" \
"wan_ip $sky_blue $thm_bg" \
"vcs_branch $thm_gray" \
# "air ${TMUX_POWERLINE_SEG_AIR_COLOR} $thm_bg" \
# "vcs_compare 60 255" \
#"vcs_staged 64 255" \
#"vcs_modified 9 255" \
Expand Down
2 changes: 2 additions & 0 deletions themes/default.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ fi

TMUX_POWERLINE_DEFAULT_BACKGROUND_COLOR=${TMUX_POWERLINE_DEFAULT_BACKGROUND_COLOR:-'235'}
TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR=${TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR:-'255'}
TMUX_POWERLINE_SEG_AIR_COLOR=$("${TMUX_POWERLINE_DIR_HOME}/segments/air_color.sh")

TMUX_POWERLINE_DEFAULT_LEFTSIDE_SEPARATOR=${TMUX_POWERLINE_DEFAULT_LEFTSIDE_SEPARATOR:-$TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD}
TMUX_POWERLINE_DEFAULT_RIGHTSIDE_SEPARATOR=${TMUX_POWERLINE_DEFAULT_RIGHTSIDE_SEPARATOR:-$TMUX_POWERLINE_SEPARATOR_LEFT_BOLD}
Expand Down Expand Up @@ -103,6 +104,7 @@ if [ -z $TMUX_POWERLINE_RIGHT_STATUS_SEGMENTS ]; then
"load 237 167" \
#"tmux_mem_cpu_load 234 136" \
"battery 137 127" \
#"air ${TMUX_POWERLINE_SEG_AIR_COLOR} 255" \
"weather 37 255" \
#"rainbarf 0 ${TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR}" \
#"xkb_layout 125 117" \
Expand Down

0 comments on commit b0063ed

Please sign in to comment.