diff --git a/waybar/config b/waybar/config index 72158b5..4373619 100644 --- a/waybar/config +++ b/waybar/config @@ -2,7 +2,7 @@ "layer": "top", "height": 30, "spacing": 4, - "modules-left": ["custom/launcher", "cpu", "memory", "temperature", "disk", "hyprland/window"], + "modules-left": ["custom/launcher", "cpu", "memory", "temperature", "disk", "custom/weather", "hyprland/window"], "modules-center": ["hyprland/workspaces"], "modules-right": ["custom/spotify", "pulseaudio", "network", "backlight", "keyboard-state", "hyprland/language", "battery", "battery#bat2", "clock", "tray", "custom/power"], "hyprland/workspaces": { @@ -105,6 +105,13 @@ "on-scroll-up": "playerctl -p spotify next", "on-scroll-down": "playerctl -p spotify previous", "exec-if": "pgrep spotfiy" - } + }, + "custom/weather": { + "format": "{}", + "tooltip": true, + "interval": 3600, + "exec": "~/dotfiles/waybar/scripts/waybar-wttr.py", + "return-type": "json" + }, } diff --git a/waybar/scripts/waybar-wttr.py b/waybar/scripts/waybar-wttr.py new file mode 100755 index 0000000..8e876c5 --- /dev/null +++ b/waybar/scripts/waybar-wttr.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python + +import json +import requests +from datetime import datetime + +WEATHER_CODES = { + '113': '☀️', + '116': '⛅️', + '119': '☁️', + '122': '☁️', + '143': '🌫', + '176': '🌦', + '179': '🌧', + '182': '🌧', + '185': '🌧', + '200': '⛈', + '227': '🌨', + '230': '❄️', + '248': '🌫', + '260': '🌫', + '263': '🌦', + '266': '🌦', + '281': '🌧', + '284': '🌧', + '293': '🌦', + '296': '🌦', + '299': '🌧', + '302': '🌧', + '305': '🌧', + '308': '🌧', + '311': '🌧', + '314': '🌧', + '317': '🌧', + '320': '🌨', + '323': '🌨', + '326': '🌨', + '329': '❄️', + '332': '❄️', + '335': '❄️', + '338': '❄️', + '350': '🌧', + '353': '🌦', + '356': '🌧', + '359': '🌧', + '362': '🌧', + '365': '🌧', + '368': '🌨', + '371': '❄️', + '374': '🌧', + '377': '🌧', + '386': '⛈', + '389': '🌩', + '392': '⛈', + '395': '❄️' +} + +data = {} + + +weather = requests.get("https://wttr.in/?format=j1").json() + + +def format_time(time): + return time.replace("00", "").zfill(2) + + +def format_temp(temp): + return (hour['FeelsLikeC']+"°").ljust(3) + + +def format_chances(hour): + chances = { + "chanceoffog": "Fog", + "chanceoffrost": "Frost", + "chanceofovercast": "Overcast", + "chanceofrain": "Rain", + "chanceofsnow": "Snow", + "chanceofsunshine": "Sunshine", + "chanceofthunder": "Thunder", + "chanceofwindy": "Wind" + } + + conditions = [] + for event in chances.keys(): + if int(hour[event]) > 0: + conditions.append(chances[event]+" "+hour[event]+"%") + return ", ".join(conditions) + + +data['text'] = WEATHER_CODES[weather['current_condition'][0]['weatherCode']] + \ + " "+weather['current_condition'][0]['FeelsLikeC']+"°" + +data['tooltip'] = f"<b>{weather['current_condition'][0]['weatherDesc'][0]['value']} {weather['current_condition'][0]['temp_C']}°</b>\n" +data['tooltip'] += f"Feels like: {weather['current_condition'][0]['FeelsLikeC']}°\n" +data['tooltip'] += f"Wind: {weather['current_condition'][0]['windspeedKmph']}Km/h\n" +data['tooltip'] += f"Humidity: {weather['current_condition'][0]['humidity']}%\n" +for i, day in enumerate(weather['weather']): + data['tooltip'] += f"\n<b>" + if i == 0: + data['tooltip'] += "Today, " + if i == 1: + data['tooltip'] += "Tomorrow, " + data['tooltip'] += f"{day['date']}</b>\n" + data['tooltip'] += f"⬆️ {day['maxtempC']}° ⬇️ {day['mintempC']}° " + data['tooltip'] += f"🌅 {day['astronomy'][0]['sunrise']} 🌇 {day['astronomy'][0]['sunset']}\n" + for hour in day['hourly']: + if i == 0: + if int(format_time(hour['time'])) < datetime.now().hour-2: + continue + data['tooltip'] += f"{format_time(hour['time'])} {WEATHER_CODES[hour['weatherCode']]} {format_temp(hour['FeelsLikeC'])} {hour['weatherDesc'][0]['value']}, {format_chances(hour)}\n" + + +print(json.dumps(data))