about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKevin Mandura <webmaster@kevin-mandura.de>2024-03-24 15:21:07 +0100
committerKevin Mandura <webmaster@kevin-mandura.de>2024-03-24 15:21:07 +0100
commit753e468eac4c545185ab7c809c1bdbb9c1de3440 (patch)
tree5fe7c3a74f766c3dfae6bf4ea92d0440c6f1744f
parentb4ba3139d898b212d5cc7c6f9cb2f4b00b2c07c4 (diff)
downloaddwm-status-sh-753e468eac4c545185ab7c809c1bdbb9c1de3440.tar.gz
dwm-status-sh-753e468eac4c545185ab7c809c1bdbb9c1de3440.zip
Add OpenWeatherMap weather status module
-rw-r--r--dwm-status.sh72
1 files changed, 71 insertions, 1 deletions
diff --git a/dwm-status.sh b/dwm-status.sh
index 9f3533e..3b75c5b 100644
--- a/dwm-status.sh
+++ b/dwm-status.sh
@@ -19,6 +19,26 @@
 # # Please check before executing  #
 # ##################################
 
+# OpenWeatherMap: API Key
+CONFIG_OWM_API_KEY=""
+
+# OpenWeatherMap: API endpoint
+CONFIG_OWM_API_ENDPOINT="http://api.openweathermap.org/data/2.5/weather?q="
+
+# OpenWeatherMap: Main web address
+CONFIG_OWM_WEBSITE_URL="https://openweathermap.org"
+
+# OpenWeatherMap: City name
+CONFIG_OWM_CITY_NAME="Chicago"
+
+# OpenWeatherMap: Temperature unit
+# e.g. "metric" for °C, default is °F
+CONFIG_OWM_TEMPERATURE_UNIT=""
+
+# OpenWeatherMap: Language code (default: en)
+# e.g. "de"
+CONFIG_OWM_LANGUAGE=""
+
 # Which date and time format to use?
 #
 # See »man date« for reference.
@@ -102,6 +122,7 @@ readonly CACHE_DISK_FREE_FILE="${CONFIG_CACHE_DIR}/disk-free.txt"
 readonly CACHE_BATTERY_FILE="${CONFIG_CACHE_DIR}/battery.txt"
 readonly CACHE_UPTIME_FILE="${CONFIG_CACHE_DIR}/uptime.txt"
 readonly CACHE_DATE_TIME_FILE="${CONFIG_CACHE_DIR}/date-time.txt"
+readonly CACHE_OPENWEATHERMAP_FILE="${CONFIG_CACHE_DIR}/openweathermap.txt"
 status_bar_refresh_iteration_count=0
 status_bar_string=""
 
@@ -125,7 +146,7 @@ initialize_cache_directory() {
     # Empty the cache directory and create empty cache files for a fresh
     # start.
     rm -f "$CONFIG_CACHE_DIR"/*
-    touch "$CACHE_NEW_MAILS_FILE" "$CACHE_ETHERNET_INTERFACE_FILE" "$CACHE_WLAN_INTERFACE_FILE" "$CACHE_VPN_INTERFACE_FILE" "$CACHE_CPU_TEMPERATURE_FILE" "$CACHE_CPU_USAGE_FILE" "$CACHE_RAM_USAGE_FILE" "$CACHE_AUDIO_VOLUME_FILE" "$CACHE_DISK_FREE_FILE" "$CACHE_BATTERY_FILE" "$CACHE_UPTIME_FILE" "$CACHE_DATE_TIME_FILE"
+    touch "$CACHE_OPENWEATHERMAP_FILE" "$CACHE_NEW_MAILS_FILE" "$CACHE_ETHERNET_INTERFACE_FILE" "$CACHE_WLAN_INTERFACE_FILE" "$CACHE_VPN_INTERFACE_FILE" "$CACHE_CPU_TEMPERATURE_FILE" "$CACHE_CPU_USAGE_FILE" "$CACHE_RAM_USAGE_FILE" "$CACHE_AUDIO_VOLUME_FILE" "$CACHE_DISK_FREE_FILE" "$CACHE_BATTERY_FILE" "$CACHE_UPTIME_FILE" "$CACHE_DATE_TIME_FILE"
 }
 
 # Note:
@@ -135,6 +156,46 @@ initialize_cache_directory() {
 # parameter makes the function only return the information from the
 # cache.
 
+module_weather() {
+    # Abort, if no API key was specified.
+    [ -n "$CONFIG_OWM_API_KEY" ] || return
+
+    if [ "$1" = "force" ]; then
+        # Test if OpenWeatherMap.org is reachable.
+        if ! wget -q --tries=1 --timeout="$CONFIG_REFRESH_INTERVAL" --spider "$CONFIG_OWM_WEBSITE_URL"; then
+            return
+        fi
+        # Receive weather temperature and descriptive text and store to file.
+        weather_data=$(curl "${CONFIG_OWM_API_ENDPOINT}${CONFIG_OWM_CITY_NAME}&units=${CONFIG_OWM_TEMPERATURE_UNIT}&appid=${CONFIG_OWM_API_KEY}&lang=${CONFIG_OWM_LANGUAGE}" -s)
+
+        weather_data_temperature=$(printf "%s" "$weather_data" | jq -r .main.temp)
+
+        # Shorten temperature to one number after decimal point.
+        LC_NUMERIC="en_US.UTF-8" # Ensure correct number interpretation.
+        weather_data_temperature=$(printf "%.1f" "$weather_data_temperature")
+
+        if [ "$CONFIG_OWM_TEMPERATURE_UNIT" = "metric" ]; then
+            weather_data_temperature="${weather_data_temperature}°C"
+        else
+            weather_data_temperature="${weather_data_temperature}°F"
+        fi
+
+        weather_data_description=$(printf "%s" "$weather_data" | jq -r '.weather[0].description')
+
+        weather_information="${weather_data_temperature} ${weather_data_description}"
+
+        printf "%s" "$weather_information" > "$CACHE_OPENWEATHERMAP_FILE"
+    else
+        # Only read latest information stored inside the cache file.
+        weather_information=$(cat "$CACHE_OPENWEATHERMAP_FILE")
+    fi
+
+    # Append to status bar string.
+    if [ -n "$weather_information" ]; then
+        status_bar_string="${status_bar_string}${weather_information}${CONFIG_DELIM_STRING}"
+    fi
+}
+
 module_mail() {
     # Abort, if no email store directory is configured.
     [ -n "$CONFIG_MAILBOX_DIR" ] || return
@@ -439,6 +500,7 @@ refresh_status_bar() {
 
     if [ "$status_bar_refresh_iteration_count" = 0 ]; then
         # It is time to update all status bar modules.
+        module_weather # only manual update using script parameter
         module_mail force
         module_vpn_interface force
         module_wlan_interface force
@@ -456,6 +518,7 @@ refresh_status_bar() {
         status_bar_refresh_iteration_count=$((status_bar_refresh_iteration_count+1))
     else
         # Only update prioritized status bar modules.
+        module_weather
         module_mail
         module_vpn_interface force
         module_wlan_interface force
@@ -501,6 +564,13 @@ if [ "$1" = "refresh" ]; then
     exit 0
 fi
 
+# If the script parameter "refresh-weather" is set, refresh the
+# weather information using the OpenWeatherMap API.
+if [ "$1" = "refresh-weather" ]; then
+    module_weather force
+    exit 0
+fi
+
 # Clear all the cache files to start afresh.
 initialize_cache_directory