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)) |
@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.
The rust version allows you to use to use
--custom-indicatorto show multiple things as the main indicator.