|
| 1 | +TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER_DEFAULT="openweather" |
| 2 | +TMUX_POWERLINE_SEG_AIR_JSON_DEFAULT="jq" |
| 3 | +TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD_DEFAULT="600" |
| 4 | + |
| 5 | +generate_segmentrc() { |
| 6 | + read -d '' rccontents << EORC |
| 7 | +# The data provider to use. Currently only "openweather" is supported. |
| 8 | +export TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER="${TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER_DEFAULT}" |
| 9 | +# How often to update the weather in seconds. |
| 10 | +export TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD="${TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD_DEFAULT}" |
| 11 | +# Location of the JSON parser, jq |
| 12 | +export TMUX_POWERLINE_SEG_AIR_JSON="${TMUX_POWERLINE_SEG_AIR_JSON_DEFAULT}" |
| 13 | +# Your location |
| 14 | +# Latitude and Longitude: |
| 15 | +TMUX_POWERLINE_SEG_AIR_LAT="" |
| 16 | +TMUX_POWERLINE_SEG_AIR_LON="" |
| 17 | +# Your Open Weather API Key: |
| 18 | +TMUX_POWERLINE_SEG_AIR_OPEN_WEATHER_API_KEY="" |
| 19 | +EORC |
| 20 | + echo "$rccontents" |
| 21 | +} |
| 22 | + |
| 23 | +run_segment() { |
| 24 | + __process_settings |
| 25 | + local tmp_file="${TMUX_POWERLINE_DIR_TEMPORARY}/temp_air_file.txt" |
| 26 | + local air |
| 27 | + case "$TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER" in |
| 28 | + "openweather") air=$(__openweather);; |
| 29 | + *) |
| 30 | + echo "Unknown weather provider [${$TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER}]"; |
| 31 | + return 1 |
| 32 | + esac |
| 33 | + trimmed_air=$(echo "$air" | cut -d' ' -f1-3) |
| 34 | + |
| 35 | + if [ -n "$trimmed_air" ]; then |
| 36 | + echo "$trimmed_air" |
| 37 | + fi |
| 38 | +} |
| 39 | + |
| 40 | +__process_settings() { |
| 41 | + if [ -z "$TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER" ]; then |
| 42 | + export TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER="${TMUX_POWERLINE_SEG_AIR_DATA_PROVIDER_DEFAULT}" |
| 43 | + fi |
| 44 | + if [ -z "$TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD" ]; then |
| 45 | + export TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD="${TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD_DEFAULT}" |
| 46 | + fi |
| 47 | + if [ -z "$TMUX_POWERLINE_SEG_AIR_JSON" ]; then |
| 48 | + export TMUX_POWERLINE_SEG_AIR_JSON="${TMUX_POWERLINE_SEG_AIR_JSON_DEFAULT}" |
| 49 | + fi |
| 50 | + if [ -z "$TMUX_POWERLINE_SEG_AIR_LAT" ] && [ -z "$TMUX_POWERLINE_SEG_AIR_LON" ]; then |
| 51 | + echo "No location defined."; |
| 52 | + exit 8 |
| 53 | + fi |
| 54 | + if [-z "$TMUX_POWERLINE_SEG_AIR_OPEN_WEATHER_API_KEY" ]; then |
| 55 | + echo "No API Key defined."; |
| 56 | + exit 8 |
| 57 | + fi |
| 58 | +} |
| 59 | + |
| 60 | +__openweather() { |
| 61 | + carbon_monoxide="" |
| 62 | + if [ -f "$tmp_file" ]; then |
| 63 | + if shell_is_osx || shell_is_bsd; then |
| 64 | + last_update=$(stat -f "%m" ${tmp_file}) |
| 65 | + elif shell_is_linux; then |
| 66 | + last_update=$(stat -c "%Y" ${tmp_file}) |
| 67 | + fi |
| 68 | + time_now=$(date +%s) |
| 69 | + |
| 70 | + up_to_date=$(echo "(${time_now}-${last_update}) < ${TMUX_POWERLINE_SEG_AIR_UPDATE_PERIOD}" | bc) |
| 71 | + if [ "$up_to_date" -eq 1 ]; then |
| 72 | + __read_tmp_file |
| 73 | + fi |
| 74 | + fi |
| 75 | + |
| 76 | + if [ -z "$carbon_monoxide" ]; then |
| 77 | + 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}") |
| 78 | + if [ "$?" -eq "0" ]; then |
| 79 | + error=$(echo "$air_quality_data" | $grep -i "error"); |
| 80 | + if [ -n "$error" ]; then |
| 81 | + echo "error" |
| 82 | + exit 1 |
| 83 | + fi |
| 84 | + |
| 85 | + jsonparser="${TMUX_POWERLINE_SEG_AIR_JSON}" |
| 86 | + carbon_monoxide=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.co) |
| 87 | + nitrogen_dioxide=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.no2) |
| 88 | + ozone=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.o3) |
| 89 | + sulphur_dioxide=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.so2) |
| 90 | + fine_particle_matter=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.pm2_5) |
| 91 | + coarse_particulate_matter=$(echo "$air_quality_data" | $jsonparser -r .list[0].components.pm10) |
| 92 | + |
| 93 | + elif [ -f "${tmp_file}" ]; then |
| 94 | + __read_tmp_file |
| 95 | + fi |
| 96 | + fi |
| 97 | + |
| 98 | + if [ -n "$carbon_monoxide" ]; then |
| 99 | + __get_us_aqi_score "$carbon_monoxide" "$nitrogen_dioxide" "$ozone" "$sulphur_dioxide" "$fine_particle_matter" "$coarse_particulate_matter" |
| 100 | + fi |
| 101 | +} |
| 102 | + |
| 103 | +__get_us_aqi_score() { |
| 104 | + local carbon_monoxide=$1 |
| 105 | + local nitrogen_dioxide=$2 |
| 106 | + local ozone=$3 |
| 107 | + local sulphur_dioxide=$4 |
| 108 | + local fine_particle_matter=$5 |
| 109 | + local coarse_particulate_matter=$6 |
| 110 | + |
| 111 | + carbon_monoxide_ppm=$(__convert_uqgm3_ppm "$carbon_monoxide") |
| 112 | + nitrogen_dioxide_ppb=$(__convert_uqgm3_ppb "$nitrogen_dioxide" "46.01") |
| 113 | + ozone_ppb=$(__convert_uqgm3_ppb "$ozone" "48.00") |
| 114 | + sulphur_dioxide_ppb=$(__convert_uqgm3_ppb "$sulphur_dioxide" "64.06") |
| 115 | + |
| 116 | + # CO ppm (8-hr) |
| 117 | + if (( $(echo "$carbon_monoxide_ppm < 4.5" | bc -l) )); then |
| 118 | + carbon_monoxide_aqi_value=$(echo "scale=3; (50/4.4) * $carbon_monoxide_ppm" | bc -l) |
| 119 | + elif (( $(echo "$carbon_monoxide_ppm < 9.5" | bc -l) )); then |
| 120 | + carbon_monoxide_aqi_value=$(echo "scale=3; (49/4.9) * ($carbon_monoxide_ppm - 4.5) + 51" | bc -l) |
| 121 | + elif (( $(echo "$carbon_monoxide_ppm < 12.5" | bc -l) )); then |
| 122 | + carbon_monoxide_aqi_value=$(echo "scale=3; (49/2.9) * ($carbon_monoxide_ppm - 9.5) + 101" | bc -l) |
| 123 | + elif (( $(echo "$carbon_monoxide_ppm < 15.5" | bc -l) )); then |
| 124 | + carbon_monoxide_aqi_value=$(echo "scale=3; (49/2.9) * ($carbon_monoxide_ppm - 12.5) + 151" | bc -l) |
| 125 | + elif (( $(echo "$carbon_monoxide_ppm < 30.5" | bc -l) )); then |
| 126 | + carbon_monoxide_aqi_value=$(echo "scale=3; (99/14.9) * ($carbon_monoxide_ppm - 15.5) + 201" | bc -l) |
| 127 | + elif (( $(echo "$carbon_monoxide_ppm < 40.5" | bc -l) )); then |
| 128 | + carbon_monoxide_aqi_value=$(echo "scale=3; (99/9.9) * ($carbon_monoxide_ppm - 30.5) + 301" | bc -l) |
| 129 | + elif (( $(echo "$carbon_monoxide_ppm < 50.5" | bc -l) )); then |
| 130 | + carbon_monoxide_aqi_value=$(echo "scale=3; (99/9.9) * ($carbon_monoxide_ppm - 40.5) + 401" | bc -l) |
| 131 | + fi |
| 132 | + |
| 133 | + # NO2 ppb (1-hr) |
| 134 | + if (( $(echo "$nitrogen_dioxide_ppb < 54" | bc -l) )); then |
| 135 | + nitrogen_dioxide_aqi_value=$(echo "scale=3; (50/53) * $nitrogen_dioxide_ppb" | bc -l) |
| 136 | + elif (( $(echo "$nitrogen_dioxide_ppb < 101" | bc -l) )); then |
| 137 | + nitrogen_dioxide_aqi_value=$(echo "scale=3; (49/46) * ($nitrogen_dioxide_ppb - 54) + 51" | bc -l) |
| 138 | + elif (( $(echo "$nitrogen_dioxide_ppb < 361" | bc -l) )); then |
| 139 | + nitrogen_dioxide_aqi_value=$(echo "scale=3; (49/259) * ($nitrogen_dioxide_ppb - 101) + 101" | bc -l) |
| 140 | + elif (( $(echo "$nitrogen_dioxide_ppb < 650" | bc -l) )); then |
| 141 | + nitrogen_dioxide_aqi_value=$(echo "scale=3; (49/288) * ($nitrogen_dioxide_ppb - 361) + 151" | bc -l) |
| 142 | + elif (( $(echo "$nitrogen_dioxide_ppb < 1250" | bc -l) )); then |
| 143 | + nitrogen_dioxide_aqi_value=$(echo "scale=3; (99/599) * ($nitrogen_dioxide_ppb - 650) + 201" | bc -l) |
| 144 | + elif (( $(echo "$nitrogen_dioxide_ppb < 1650" | bc -l) )); then |
| 145 | + nitrogen_dioxide_aqi_value=$(echo "scale=3; (99/399) * ($nitrogen_dioxide_ppb - 1250) + 301" | bc -l) |
| 146 | + elif (( $(echo "$nitrogen_dioxide_ppb < 2050" | bc -l) )); then |
| 147 | + nitrogen_dioxide_aqi_value=$(echo "scale=3; (99/399) * ($nitrogen_dioxide_ppb - 1650) + 401" | bc -l) |
| 148 | + fi |
| 149 | + |
| 150 | + # O3 ppb (8-hr) |
| 151 | + if (( $(echo "$ozone_ppb < 55" | bc -l) )); then |
| 152 | + ozone_aqi_value=$(echo "scale=3; (50/54) * $ozone_ppb" | bc -l) |
| 153 | + elif (( $(echo "$ozone_ppb < 71" | bc -l) )); then |
| 154 | + ozone_aqi_value=$(echo "scale=3; (49/15) * ($ozone_ppb - 55) + 51" | bc -l) |
| 155 | + elif (( $(echo "$ozone_ppb < 86" | bc -l) )); then |
| 156 | + ozone_aqi_value=$(echo "scale=3; (49/14) * ($ozone_ppb - 71) + 101" | bc -l) |
| 157 | + elif (( $(echo "$ozone_ppb < 106" | bc -l) )); then |
| 158 | + ozone_aqi_value=$(echo "scale=3; (49/19) * ($ozone_ppb - 86) + 151" | bc -l) |
| 159 | + elif (( $(echo "$ozone_ppb < 201" | bc -l) )); then |
| 160 | + ozone_aqi_value=$(echo "scale=3; (99/94) * ($ozone_ppb - 106) + 201" | bc -l) |
| 161 | + fi |
| 162 | + |
| 163 | + # SO2 ppb (1-hr) |
| 164 | + if (( $(echo "$sulphur_dioxide_ppb < 36" | bc -l) )); then |
| 165 | + sulphur_dioxide_aqi_value=$(echo "scale=3; (50/35) * $sulphur_dioxide_ppb" | bc -l) |
| 166 | + elif (( $(echo "$sulphur_dioxide_ppb < 76" | bc -l) )); then |
| 167 | + sulphur_dioxide_aqi_value=$(echo "scale=3; (49/39) * ($sulphur_dioxide_ppb - 36) + 51" | bc -l) |
| 168 | + elif (( $(echo "$sulphur_dioxide_ppb < 186" | bc -l) )); then |
| 169 | + sulphur_dioxide_aqi_value=$(echo "scale=3; (49/109) * ($sulphur_dioxide_ppb - 76) + 101" | bc -l) |
| 170 | + elif (( $(echo "$sulphur_dioxide_ppb < 305" | bc -l) )); then |
| 171 | + sulphur_dioxide_aqi_value=$(echo "scale=3; (49/118) * ($sulphur_dioxide_ppb - 186) + 151" | bc -l) |
| 172 | + elif (( $(echo "$sulphur_dioxide_ppb < 605" | bc -l) )); then |
| 173 | + sulphur_dioxide_aqi_value=$(echo "scale=3; (99/299) * ($sulphur_dioxide_ppb - 305) + 201" | bc -l) |
| 174 | + elif (( $(echo "$sulphur_dioxide_ppb < 805" | bc -l) )); then |
| 175 | + sulphur_dioxide_aqi_value=$(echo "scale=3; (99/199) * ($sulphur_dioxide_ppb - 605) + 301" | bc -l) |
| 176 | + elif (( $(echo "$sulphur_dioxide_ppb < 1005" | bc -l) )); then |
| 177 | + sulphur_dioxide_aqi_value=$(echo "scale=3; (99/199) * ($sulphur_dioxide_ppb - 805) + 401" | bc -l) |
| 178 | + fi |
| 179 | + |
| 180 | + # PM2.5 (24-hr) |
| 181 | + if (( $(echo "$fine_particle_matter < 12.1" | bc -l) )); then |
| 182 | + fine_particle_aqi_value=$(echo "scale=3; (50/12) * $fine_particle_matter" | bc -l) |
| 183 | + elif (( $(echo "$fine_particle_matter < 35.5" | bc -l) )); then |
| 184 | + fine_particle_aqi_value=$(echo "scale=3; (49/23.3) * ($fine_particle_matter - 12.1) + 51" | bc -l) |
| 185 | + elif (( $(echo "$fine_particle_matter < 55.5" | bc -l) )); then |
| 186 | + fine_particle_aqi_value=$(echo "scale=3; (49/19.9) * ($fine_particle_matter - 35.5) + 101" | bc -l) |
| 187 | + elif (( $(echo "$fine_particle_matter < 150.5" | bc -l) )); then |
| 188 | + fine_particle_aqi_value=$(echo "scale=3; (49/94.9) * ($fine_particle_matter - 55.5) + 151" | bc -l) |
| 189 | + elif (( $(echo "$fine_particle_matter < 250.5" | bc -l) )); then |
| 190 | + fine_particle_aqi_value=$(echo "scale=3; (99/99.9) * ($fine_particle_matter - 150.5) + 201" | bc -l) |
| 191 | + elif (( $(echo "$fine_particle_matter < 350.5" | bc -l) )); then |
| 192 | + fine_particle_aqi_value=$(echo "scale=3; (99/99.9) * ($fine_particle_matter - 250.5) + 301" | bc -l) |
| 193 | + elif (( $(echo "$fine_particle_matter < 500.5" | bc -l) )); then |
| 194 | + fine_particle_aqi_value=$(echo "scale=3; (99/149.9) * ($fine_particle_matter - 350.5) + 401" | bc -l) |
| 195 | + fi |
| 196 | + |
| 197 | + # PM10 (24-hr) |
| 198 | + if (( $(echo "$coarse_particulate_matter < 55" | bc -l) )); then |
| 199 | + coarse_particulate_aqi_value=$(echo "scale=3; (50/54) * $coarse_particulate_matter" | bc -l) |
| 200 | + elif (( $(echo "$coarse_particulate_matter < 155" | bc -l) )); then |
| 201 | + coarse_particulate_aqi_value=$(echo "scale=3; (49/99) * ($coarse_particulate_matter - 55) + 51" | bc -l) |
| 202 | + elif (( $(echo "$coarse_particulate_matter < 255" | bc -l) )); then |
| 203 | + coarse_particulate_aqi_value=$(echo "scale=3; (49/99) * ($coarse_particulate_matter - 155) + 101" | bc -l) |
| 204 | + elif (( $(echo "$coarse_particulate_matter < 355" | bc -l) )); then |
| 205 | + coarse_particulate_aqi_value=$(echo "scale=3; (49/99) * ($coarse_particulate_matter - 255) + 151" | bc -l) |
| 206 | + elif (( $(echo "$coarse_particulate_matter < 425" | bc -l) )); then |
| 207 | + coarse_particulate_aqi_value=$(echo "scale=3; (99/69) * ($coarse_particulate_matter - 355) + 201" | bc -l) |
| 208 | + elif (( $(echo "$coarse_particulate_matter < 505" | bc -l) )); then |
| 209 | + coarse_particulate_aqi_value=$(echo "scale=3; (99/79) * ($coarse_particulate_matter - 425) + 301" | bc -l) |
| 210 | + elif (( $(echo "$coarse_particulate_matter < 605" | bc -l) )); then |
| 211 | + coarse_particulate_aqi_value=$(echo "scale=3; (99/99) * ($coarse_particulate_matter - 505) + 401" | bc -l) |
| 212 | + fi |
| 213 | + |
| 214 | + 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") |
| 215 | + IFS=' ' read -r aqi_level aqi_color aqi_symbol <<< "$(__get_aqi_level_color_symbol "$aqi_value")" |
| 216 | + rounded_aqi=$(printf '%.*f\n' 0 "$aqi_value") |
| 217 | + |
| 218 | + echo "${rounded_aqi} AQI ${aqi_symbol}" "${aqi_color}" | tee "${tmp_file}" |
| 219 | +} |
| 220 | + |
| 221 | +__convert_uqgm3_ppm(){ |
| 222 | + local uqm3=$1 |
| 223 | + |
| 224 | + ppm=$(echo "scale=3; $uqm3 / 1000" | bc) |
| 225 | + |
| 226 | + echo $ppm |
| 227 | +} |
| 228 | + |
| 229 | +__convert_uqgm3_ppb(){ |
| 230 | + local uqm3=$1 |
| 231 | + local molecular_weight=$2 |
| 232 | + |
| 233 | + ppb=$(echo "scale=3; ($uqm3 * 24.45) / $molecular_weight" | bc) |
| 234 | + |
| 235 | + echo $ppb |
| 236 | +} |
| 237 | + |
| 238 | +__get_aqi_max(){ |
| 239 | + local n1=$1 |
| 240 | + local n2=$2 |
| 241 | + local n3=$3 |
| 242 | + local n4=$4 |
| 243 | + local n5=$5 |
| 244 | + local n6=$6 |
| 245 | + |
| 246 | + max=$n1 |
| 247 | + |
| 248 | + if (( $(echo "$n2 > $max" | bc -l) )); then |
| 249 | + max=$n2 |
| 250 | + fi |
| 251 | + |
| 252 | + if (( $(echo "$n3 > $max" | bc -l) )); then |
| 253 | + max=$n3 |
| 254 | + fi |
| 255 | + |
| 256 | + if (( $(echo "$n4 > $max" | bc -l) )); then |
| 257 | + max=$n4 |
| 258 | + fi |
| 259 | + |
| 260 | + if (( $(echo "$n5 > $max" | bc -l) )); then |
| 261 | + max=$n5 |
| 262 | + fi |
| 263 | + |
| 264 | + if (( $(echo "$n6 > $max" | bc -l) )); then |
| 265 | + max=$n6 |
| 266 | + fi |
| 267 | + |
| 268 | + echo $max |
| 269 | +} |
| 270 | + |
| 271 | +__get_aqi_level_color_symbol(){ |
| 272 | + local aqi_value=$1 |
| 273 | + |
| 274 | + if (( $(echo "$aqi_value < 51" | bc -l) )); then |
| 275 | + aqi_level="Good" |
| 276 | + aqi_color="#8da101" # Green |
| 277 | + aqi_symbol="😊" |
| 278 | + elif (( $(echo "$aqi_value < 101" | bc -l) )); then |
| 279 | + aqi_level="Moderate" |
| 280 | + aqi_color="#dfa000" # Yellow |
| 281 | + aqi_symbol="😐" |
| 282 | + elif (( $(echo "$aqi_value < 151" | bc -l) )); then |
| 283 | + aqi_level="Unhealthy for sensitive groups" |
| 284 | + aqi_color="#f57d26" # Orange |
| 285 | + aqi_symbol="🙁" |
| 286 | + elif (( $(echo "$aqi_value < 201" | bc -l) )); then |
| 287 | + aqi_level="Unhealthy" |
| 288 | + aqi_color="#f85552" # Red |
| 289 | + aqi_symbol="😷" |
| 290 | + elif (( $(echo "$aqi_value < 301" | bc -l) )); then |
| 291 | + aqi_level="Very unhealthy" |
| 292 | + aqi_color="#df69ba" # Purple |
| 293 | + aqi_symbol="😨" |
| 294 | + elif (( $(echo "$aqi_value < 501" | bc -l) )); then |
| 295 | + aqi_level="Hazardous" |
| 296 | + aqi_color="#542d2c" # Maroon |
| 297 | + aqi_symbol="🛑" |
| 298 | + elif (( $(echo "$aqi_value < 1001" | bc -l) )); then |
| 299 | + aqi_level="Very Hazardous" |
| 300 | + aqi_color="#66401a" # Brown |
| 301 | + aqi_symbol="💀" |
| 302 | + fi |
| 303 | + |
| 304 | + echo $aqi_level $aqi_color $aqi_symbol |
| 305 | +} |
| 306 | + |
| 307 | +__read_tmp_file() { |
| 308 | + if [ ! -f "$tmp_file" ]; then |
| 309 | + return |
| 310 | + fi |
| 311 | + cat "${tmp_file}" |
| 312 | + exit |
| 313 | +} |
0 commit comments