#!/usr/bin/python3 from urllib.request import urlopen from datetime import datetime import pandas as pd import numpy as np import json # --- Put in the information below --- latitude = 45.4112 longitude = -75.6981 # ------------------------------------ url = "https://api.open-meteo.com/v1/forecast?" url += "latitude=" + str(latitude) + "&longitude=" + str(longitude) url += "¤t=weather_code,temperature_2m,apparent_temperature,relative_humidity_2m,wind_speed_10m" url += "&hourly=weather_code,temperature_2m,precipitation_probability" url += "&daily=weather_code,temperature_2m_min,temperature_2m_max,sunrise,sunset,precipitation_probability_max" url += "&timezone=America/New_York" url += "&forecast_hours=12" #print(url) wmo_data = { # description night icon day icon 0: ['Clear sky', u'\uf186', u'\uf185'], 1: ['Mainly clear', u'\uf6c3', u'\uf6c4'], 2: ['Partly cloudy', u'\uf6c3', u'\uf6c4'], 3: ['Overcast', u'\uf0c2', u'\uf0c2'], 45: ['Foggy', u'\uf75f', u'\uf75f'], 48: ['Foggy', u'\uf75f', u'\uf75f'], # Depositing rime fog 51: ['Light drizzle', u'\uf73c', u'\uf743'], 53: ['Drizzle', u'\uf73c', u'\uf743'], 55: ['Heavy drizzle', u'\uf73c', u'\uf743'], 56: ['Freezing drizzle',u'\uf7ad', u'\uf7ad'], # Freezing drizzle (light) 57: ['Freezing drizzle',u'\uf7ad', u'\uf7ad'], # Freezing drizzle (moderate and heavy) 61: ['Light rain', u'\uf73d', u'\uf73d'], 63: ['Rain', u'\uf740', u'\uf740'], 65: ['Heavy rain', u'\uf740', u'\uf740'], 66: ['Freezing rain', u'\uf7ad', u'\uf7ad'], # Freezing rain (light) 67: ['Freezing rain', u'\uf7ad', u'\uf7ad'], # Freezing rain (heavy) 71: ['Light snow', u'\uf2dc', u'\uf2dc'], 73: ['Snow', u'\uf2dc', u'\uf2dc'], 75: ['Heavy snow', u'\uf2dc', u'\uf2dc'], 77: ['Snow grains', u'\uf73b', u'\uf73b'], 80: ['Rain showers', u'\uf73d', u'\uf73d'], # Rain showers (light) 81: ['Rain showers', u'\uf740', u'\uf740'], # Rain showers (moderate) 82: ['Rain showers', u'\uf740', u'\uf740'], # Rain showers (heavy) 85: ['Snow showers', u'\uf2dc', u'\uf2dc'], # Snow showers (light) 86: ['Snow showers', u'\uf2dc', u'\uf2dc'], # Snow showers (heavy) 95: ['Thunderstorm', u'\uf76c', u'\uf76c'], # Thunderstorm (light or moderate) 96: ['Thunderstorm', u'\uf76c', u'\uf76c'], # Thunderstorm with light hail 99: ['Thunderstorm', u'\uf76c', u'\uf76c'] # Thunderstorm with heavy hail } try: data_json = json.loads(urlopen(url).read()) except: print("ERROR") cur_time = datetime.strptime(data_json['current']['time'], '%Y-%m-%dT%H:%M') sunrise = datetime.strptime(data_json['daily']['sunrise'][0],'%Y-%m-%dT%H:%M') sunset = datetime.strptime(data_json['daily']['sunset'][0],'%Y-%m-%dT%H:%M') cur_is_dt = 1 if (cur_time>sunrise) & (cur_time<sunset) else 0 # Current values cur_wc = data_json['current']['weather_code'] cur_temp = round(data_json['current']['temperature_2m']) cur_apparent_temp = round(data_json['current']['apparent_temperature']) cur_humidity = round(data_json['current']['relative_humidity_2m']) cur_wind = round(data_json['current']['wind_speed_10m']) # Hourly forecast hourly_date = ['']*3 hourly_wc = [0]*3 hourly_temp = [0]*3 hourly_precipitation = [0]*3 hourly_is_dt = [0]*3 k=0 for i in range(12): this_time = datetime.strptime(data_json['hourly']['time'][i], '%Y-%m-%dT%H:%M') if (this_time>cur_time) & (k<3): hourly_date[k] = this_time.strftime("%H:%M") hourly_wc[k] = data_json['hourly']['weather_code'][i] hourly_temp[k] = round(data_json['hourly']['temperature_2m'][i]) hourly_precipitation[k] = round(data_json['hourly']['precipitation_probability'][i]) hourly_is_dt[k] = 1 if (this_time>sunrise) & (this_time<sunset) else 0 k = k+1 # Daily forecast daily_date = ['']*7 daily_wc = [0]*7 daily_temp_min = [0]*7 daily_temp_max = [0]*7 daily_precipitation = [0]*7 for i in range(7): daily_date[i] = datetime.strptime(data_json['daily']['time'][i], '%Y-%m-%d').strftime("%a %d") daily_wc[i] = data_json['daily']['weather_code'][i] daily_temp_min[i] = round(data_json['daily']['temperature_2m_min'][i]) daily_temp_max[i] = round(data_json['daily']['temperature_2m_max'][i]) daily_precipitation[i] = round(data_json['daily']['precipitation_probability_max'][i]) # Construct tooltip layout #tooltip_text = str.format( # "{}\n{}\n\n{}\n{}\n{}\n\n{}\n{}\n{}\n=====\n{}\n{}\n{}\n{}", # f'<span size="xx-large">{wmo_data[cur_wc][cur_is_dt+1]}</span> <big>{wmo_data[cur_wc][0]}</big>', # f'<big>{cur_temp}°c (feels like {cur_apparent_temp}°c)</big>', # f'\uf2ca {daily_temp_min[0]}°c / {daily_temp_max[0]}°c', # f'\uf185 {sunrise.strftime("%H:%M")} / {sunset.strftime("%H:%M")}', # f'\uf72e {cur_wind}km/h / \uf773 {cur_humidity}%', # f'<b>Forcast:</b>\t\t\uf2ca\t\uf0e9', # f'{hourly_date[0]}\t{wmo_data[hourly_wc[0]][hourly_is_dt[0]+1]}\t{hourly_temp[0]}°c\t{hourly_precipitation[0]}%', # f'{hourly_date[1]}\t{wmo_data[hourly_wc[1]][hourly_is_dt[1]+1]}\t{hourly_temp[1]}°c\t{hourly_precipitation[1]}%', # f'{daily_date[1]}\t{wmo_data[daily_wc[1]][2]}\t{daily_temp_min[1]} / {daily_temp_max[1]}\t{daily_precipitation[1]}%', # f'{daily_date[2]}\t{wmo_data[daily_wc[2]][2]}\t{daily_temp_min[2]} / {daily_temp_max[2]}\t{daily_precipitation[2]}%', # f'{daily_date[3]}\t{wmo_data[daily_wc[3]][2]}\t{daily_temp_min[3]} / {daily_temp_max[3]}\t{daily_precipitation[3]}%', # f'{daily_date[4]}\t{wmo_data[daily_wc[4]][2]}\t{daily_temp_min[4]} / {daily_temp_max[4]}\t{daily_precipitation[4]}%', #) tooltip_text = str.format( "{}\n{}\n\n{}\n{}\n{}\n\n{}\n{}\n\n{}\n{}\n{}\n{}\n{}", f'<span size="xx-large">{wmo_data[cur_wc][cur_is_dt+1]}</span> <big>{wmo_data[cur_wc][0]}</big>', f'<big>{cur_temp}°c (feels like {cur_apparent_temp}°c)</big>', f'\uf2ca {daily_temp_min[0]}°c / {daily_temp_max[0]}°c', f'\uf185 {sunrise.strftime("%H:%M")} / {sunset.strftime("%H:%M")}', f'\uf72e {cur_wind}km/h / \uf773 {cur_humidity}%', f'{hourly_date[0]}\t{hourly_date[1]}\t{hourly_date[2]}', f'{wmo_data[hourly_wc[0]][hourly_is_dt[0]+1]} {hourly_temp[0]}°c\t{wmo_data[hourly_wc[1]][hourly_is_dt[1]+1]} {hourly_temp[1]}°c\t{wmo_data[hourly_wc[2]][hourly_is_dt[2]+1]} {hourly_temp[2]}°c\t', f'\t\t\uf2ca\t\uf0e9', f'{daily_date[1]}\t{wmo_data[daily_wc[1]][2]}\t{daily_temp_min[1]} / {daily_temp_max[1]}\t{daily_precipitation[1]}%', f'{daily_date[2]}\t{wmo_data[daily_wc[2]][2]}\t{daily_temp_min[2]} / {daily_temp_max[2]}\t{daily_precipitation[2]}%', f'{daily_date[3]}\t{wmo_data[daily_wc[3]][2]}\t{daily_temp_min[3]} / {daily_temp_max[3]}\t{daily_precipitation[3]}%', f'{daily_date[4]}\t{wmo_data[daily_wc[4]][2]}\t{daily_temp_min[4]} / {daily_temp_max[4]}\t{daily_precipitation[4]}%', ) out_data = { "text": f" {wmo_data[cur_wc][cur_is_dt+1]} {cur_temp}°c ", "tooltip": tooltip_text, } print(json.dumps(out_data)) exit()