This Python script is not maintained and was replaced by the more robust Rust version below:
Last active
April 12, 2025 05:42
-
-
Save bjesus/f8db49e1434433f78e5200dc403d58a3 to your computer and use it in GitHub Desktop.
Weather widget for waybar
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"custom/weather": { | |
"format": "{}", | |
"tooltip": true, | |
"interval": 3600, | |
"exec": "waybar-wttr.py", | |
"return-type": "json" | |
}, |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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)) |
Thanks @manio , such a great message to receive! ❤️ it's nice to have so many people contributing to wttrbar now (14 contributers so far!) and the the strictness of Rust makes it easier to keep it all structured in a sane way.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@bjesus I was still using this python version (very often it was not working for unknown reason - it was just not showing the weather in some specific refresh-cycle, next hour after refresh it was OK).
Today I was copying this plugin and config to my new Arch sway machine and the script was working fine from console, but
swaybar
was complaining about some JSON parsing - weird.I was googling how to fix this problem and ... I encounter your Rust version which I was not even aware of!
I don't have to say how great news is this!
Your great weather applet is now in rock-solid rust version! Yay! 🎉
Much thank you for this. Now I have it migrated and works like a charm! 🚀 :)