This Python script is not maintained and was replaced by the more robust Rust version below:
-
-
Save bjesus/f8db49e1434433f78e5200dc403d58a3 to your computer and use it in GitHub Desktop.
"custom/weather": { | |
"format": "{}", | |
"tooltip": true, | |
"interval": 3600, | |
"exec": "waybar-wttr.py", | |
"return-type": "json" | |
}, |
#!/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)) |
The rust version allows you to use to use --custom-indicator
to show multiple things as the main indicator.
@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! 🚀 :)
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.
@daxisunder Just copy and paste line 95 and change one of them to be
tempC
, and also update the description accordingly.