Skip to content

Commit aba4a61

Browse files
committed
added air quality segment
1 parent c10d55d commit aba4a61

File tree

4 files changed

+326
-0
lines changed

4 files changed

+326
-0
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,4 @@ Skywarth <[email protected]>
4141
Drew Daniels <[email protected]>
4242
Danfeng Shan <[email protected]>
4343
Abraham Nuñez <[email protected]>
44+
Gavin Kondrath <[email protected]>

lib/headers.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,5 @@ source "${TMUX_POWERLINE_DIR_LIB}/formatting.sh"
1919
source "${TMUX_POWERLINE_DIR_LIB}/muting.sh"
2020
source "${TMUX_POWERLINE_DIR_LIB}/powerline.sh"
2121
source "${TMUX_POWERLINE_DIR_LIB}/rcfile.sh"
22+
23+
source "${TMUX_POWERLINE_DIR_HOME}/segments/air.sh"

segments/air.sh

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

themes/default.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ if [ -z $TMUX_POWERLINE_RIGHT_STATUS_SEGMENTS ]; then
103103
"load 237 167" \
104104
#"tmux_mem_cpu_load 234 136" \
105105
"battery 137 127" \
106+
#"air ${TMUX_POWERLINE_SEG_AIR_COLOR} 255" \
106107
"weather 37 255" \
107108
#"rainbarf 0 ${TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR}" \
108109
#"xkb_layout 125 117" \

0 commit comments

Comments
 (0)