| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | #!/usr/bin/python3 | 
					
						
							|  |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:34:01 +01:00
										 |  |  | Weather module for Inky-Calendar software. | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:34:01 +01:00
										 |  |  | The lunar phase calculation is from Sean B. Palmer, inamidst.com. | 
					
						
							|  |  |  | Thank You Palmer for the awesome code! | 
					
						
							| 
									
										
										
										
											2019-11-05 15:45:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | Copyright by aceisace | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | from __future__ import print_function | 
					
						
							|  |  |  | import pyowm | 
					
						
							|  |  |  | from settings import * | 
					
						
							|  |  |  | from configuration import * | 
					
						
							|  |  |  | from PIL import Image, ImageDraw, ImageFont | 
					
						
							|  |  |  | import arrow | 
					
						
							| 
									
										
										
										
											2019-11-05 15:45:56 +01:00
										 |  |  | import math, decimal | 
					
						
							|  |  |  | dec = decimal.Decimal | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | print('Initialising weather...', end=' ') | 
					
						
							|  |  |  | owm = pyowm.OWM(api_key, language=language) | 
					
						
							|  |  |  | print('Done') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Icon-code to unicode dictionary for weather-font""" | 
					
						
							|  |  |  | weathericons = { | 
					
						
							|  |  |  |   '01d': '\uf00d', '02d': '\uf002', '03d': '\uf013', | 
					
						
							|  |  |  |   '04d': '\uf012', '09d': '\uf01a', '10d': '\uf019', | 
					
						
							|  |  |  |   '11d': '\uf01e', '13d': '\uf01b', '50d': '\uf014', | 
					
						
							|  |  |  |   '01n': '\uf02e', '02n': '\uf013', '03n': '\uf013', | 
					
						
							|  |  |  |   '04n': '\uf013', '09n': '\uf037', '10n': '\uf036', | 
					
						
							|  |  |  |   '11n': '\uf03b', '13n': '\uf038', '50n': '\uf023' | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-05 15:45:56 +01:00
										 |  |  | """Add a border to increase readability""" | 
					
						
							|  |  |  | border_top = int(top_section_height * 0.05) | 
					
						
							|  |  |  | border_left = int(top_section_width * 0.02) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Calculate size for each weather sub-section""" | 
					
						
							|  |  |  | row_height = (top_section_height-(border_top*2)) // 3 | 
					
						
							|  |  |  | coloumn_width = (top_section_width-(border_left*2)) // 7 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Calculate paddings""" | 
					
						
							|  |  |  | x_padding = int( (top_section_width % coloumn_width) / 2 ) | 
					
						
							|  |  |  | y_padding = int( (top_section_height % row_height) / 2 ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Allocate sizes for weather icons""" | 
					
						
							|  |  |  | icon_small = row_height | 
					
						
							|  |  |  | icon_medium = row_height * 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Calculate the x-axis position of each coloumn""" | 
					
						
							|  |  |  | coloumn1 = x_padding | 
					
						
							|  |  |  | coloumn2 = coloumn1 + coloumn_width | 
					
						
							|  |  |  | coloumn3 = coloumn2 + coloumn_width | 
					
						
							|  |  |  | coloumn4 = coloumn3 + coloumn_width | 
					
						
							|  |  |  | coloumn5 = coloumn4 + coloumn_width | 
					
						
							|  |  |  | coloumn6 = coloumn5 + coloumn_width | 
					
						
							|  |  |  | coloumn7 = coloumn6 + coloumn_width | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Calculate the y-axis position of each row""" | 
					
						
							|  |  |  | row1 = y_padding | 
					
						
							|  |  |  | row2 = row1 + row_height | 
					
						
							|  |  |  | row3 = row2 + row_height | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Allocate positions for current weather details""" | 
					
						
							|  |  |  | text_now_pos = (coloumn1, row1) | 
					
						
							|  |  |  | weather_icon_now_pos = (coloumn1, row2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | temperature_icon_now_pos = (coloumn2, row1) | 
					
						
							|  |  |  | temperature_now_pos = (coloumn2+icon_small, row1) | 
					
						
							|  |  |  | humidity_icon_now_pos = (coloumn2, row2) | 
					
						
							|  |  |  | humidity_now_pos = (coloumn2+icon_small, row2) | 
					
						
							|  |  |  | windspeed_icon_now_pos = (coloumn2, row3) | 
					
						
							|  |  |  | windspeed_now_pos = (coloumn2+icon_small, row3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | moon_phase_now_pos = (coloumn3, row1) | 
					
						
							|  |  |  | sunrise_icon_now_pos = (coloumn3, row2) | 
					
						
							|  |  |  | sunrise_time_now_pos = (coloumn3+icon_small, row2) | 
					
						
							|  |  |  | sunset_icon_now_pos = (coloumn3, row3) | 
					
						
							|  |  |  | sunset_time_now_pos = (coloumn3+ icon_small, row3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Allocate positions for weather forecast after 3 hours""" | 
					
						
							| 
									
										
										
										
											2019-11-25 21:34:01 +01:00
										 |  |  | text_fc1_pos = (coloumn4, row1) | 
					
						
							|  |  |  | icon_fc1_pos = (coloumn4, row2) | 
					
						
							|  |  |  | temperature_fc1_pos = (coloumn4, row3) | 
					
						
							| 
									
										
										
										
											2019-11-05 15:45:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | """Allocate positions for weather forecast after 6 hours""" | 
					
						
							| 
									
										
										
										
											2019-11-25 21:34:01 +01:00
										 |  |  | text_fc2_pos = (coloumn5, row1) | 
					
						
							|  |  |  | icon_fc2_pos = (coloumn5, row2) | 
					
						
							|  |  |  | temperature_fc2_pos = (coloumn5, row3) | 
					
						
							| 
									
										
										
										
											2019-11-05 15:45:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | """Allocate positions for weather forecast after 9 hours""" | 
					
						
							| 
									
										
										
										
											2019-11-25 21:34:01 +01:00
										 |  |  | text_fc3_pos = (coloumn6, row1) | 
					
						
							|  |  |  | icon_fc3_pos = (coloumn6, row2) | 
					
						
							|  |  |  | temperature_fc3_pos = (coloumn6, row3) | 
					
						
							| 
									
										
										
										
											2019-11-05 15:45:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | """Allocate positions for weather forecast after 12 hours""" | 
					
						
							| 
									
										
										
										
											2019-11-25 21:34:01 +01:00
										 |  |  | text_fc4_pos = (coloumn7, row1) | 
					
						
							|  |  |  | icon_fc4_pos = (coloumn7, row2) | 
					
						
							|  |  |  | temperature_fc4_pos = (coloumn7, row3) | 
					
						
							| 
									
										
										
										
											2019-11-05 15:45:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | """Windspeed (m/s) to beaufort (index of list) conversion""" | 
					
						
							|  |  |  | windspeed_to_beaufort = [0.02, 1.5, 3.3, 5.4, 7.9, 10.7, 13.8, 17.1, 20.7, | 
					
						
							|  |  |  |   24.4, 28.4, 32.6, 100] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Function to convert tempertures from kelvin to celcius or fahrenheit""" | 
					
						
							|  |  |  | def to_units(kelvin): | 
					
						
							|  |  |  |   if units == 'metric': | 
					
						
							|  |  |  |     conversion =  str(int(kelvin - 273.15)) + '°C' | 
					
						
							|  |  |  |   else: | 
					
						
							|  |  |  |     conversion = str(int((kelvin - 273.15) * 9/5 + 32)) + 'F' | 
					
						
							|  |  |  |   return conversion | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Function to convert time objects to specified format 12/24 hours""" | 
					
						
							|  |  |  | """Simple means just the hour and if 12 hours, am/pm as well""" | 
					
						
							|  |  |  | def to_hours(datetime_object, simple = False): | 
					
						
							|  |  |  |   if hours == '24': | 
					
						
							|  |  |  |     if simple == True: | 
					
						
							| 
									
										
										
										
											2019-11-25 21:34:01 +01:00
										 |  |  |       converted_time = datetime_object.format('H') + '.00' | 
					
						
							| 
									
										
										
										
											2019-11-05 15:45:56 +01:00
										 |  |  |     else: | 
					
						
							|  |  |  |       converted_time = datetime_object.format('HH:mm') | 
					
						
							|  |  |  |   else: | 
					
						
							|  |  |  |     if simple == True: | 
					
						
							|  |  |  |       converted_time = datetime_object.format('H a') | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |       converted_time = datetime_object.format('hh:mm') | 
					
						
							|  |  |  |   return str(converted_time) | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:34:01 +01:00
										 |  |  | """Choose font optimised for the weather section""" | 
					
						
							|  |  |  | fontsize = 8 | 
					
						
							|  |  |  | font = ImageFont.truetype(NotoSans+'.ttf', fontsize) | 
					
						
							|  |  |  | fill_height = 0.8 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | while font.getsize('hg')[1] <= (row_height * fill_height): | 
					
						
							|  |  |  |   fontsize += 1 | 
					
						
							|  |  |  |   font = ImageFont.truetype(NotoSans+'.ttf', fontsize) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							| 
									
										
										
										
											2019-11-05 15:45:56 +01:00
										 |  |  |   """Connect to Openweathermap API and fetch weather data""" | 
					
						
							|  |  |  |   if top_section == "Weather" and api_key != "" and owm.is_API_online() is True: | 
					
						
							| 
									
										
										
										
											2019-11-25 21:34:01 +01:00
										 |  |  |     try: | 
					
						
							|  |  |  |       print('Weather module: Connectivity check passed, Generating image...', | 
					
						
							|  |  |  |         end = '') | 
					
						
							|  |  |  |       current_weather_setup = owm.weather_at_place(location) | 
					
						
							|  |  |  |       weather = current_weather_setup.get_weather() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Set-up and get weather forecast data""" | 
					
						
							|  |  |  |       forecast = owm.three_hours_forecast(location) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Round the hour to the nearest multiple of 3""" | 
					
						
							|  |  |  |       now = arrow.now(tz=get_tz()) | 
					
						
							|  |  |  |       if (now.hour % 3) != 0: | 
					
						
							|  |  |  |         hour_gap = 3 - (now.hour % 3) | 
					
						
							|  |  |  |       else: | 
					
						
							|  |  |  |         hour_gap = 3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Prepare timings for forecasts""" | 
					
						
							|  |  |  |       fc1 = now.replace(hours = + hour_gap) | 
					
						
							|  |  |  |       fc2 = now.replace(hours = + hour_gap + 3) | 
					
						
							|  |  |  |       fc3 = now.replace(hours = + hour_gap + 6) | 
					
						
							|  |  |  |       fc4 = now.replace(hours = + hour_gap + 9) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Prepare forecast objects for the specified timings""" | 
					
						
							|  |  |  |       forecast_fc1 = forecast.get_weather_at(fc1.datetime) | 
					
						
							|  |  |  |       forecast_fc2 = forecast.get_weather_at(fc2.datetime) | 
					
						
							|  |  |  |       forecast_fc3 = forecast.get_weather_at(fc3.datetime) | 
					
						
							|  |  |  |       forecast_fc4 = forecast.get_weather_at(fc4.datetime) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Get the current temperature and forcasts temperatures""" | 
					
						
							|  |  |  |       temperature_now = to_units(weather.get_temperature()['temp']) | 
					
						
							|  |  |  |       temperature_fc1 = to_units(forecast_fc1.get_temperature()['temp']) | 
					
						
							|  |  |  |       temperature_fc2 = to_units(forecast_fc2.get_temperature()['temp']) | 
					
						
							|  |  |  |       temperature_fc3 = to_units(forecast_fc3.get_temperature()['temp']) | 
					
						
							|  |  |  |       temperature_fc4 = to_units(forecast_fc4.get_temperature()['temp']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Get current and forecast weather icon names""" | 
					
						
							|  |  |  |       weather_icon_now = weather.get_weather_icon_name() | 
					
						
							|  |  |  |       weather_icon_fc1 = forecast_fc1.get_weather_icon_name() | 
					
						
							|  |  |  |       weather_icon_fc2 = forecast_fc2.get_weather_icon_name() | 
					
						
							|  |  |  |       weather_icon_fc3 = forecast_fc3.get_weather_icon_name() | 
					
						
							|  |  |  |       weather_icon_fc4 = forecast_fc4.get_weather_icon_name() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Parse current weather details""" | 
					
						
							|  |  |  |       sunrise_time_now = arrow.get(weather.get_sunrise_time()).to(get_tz()) | 
					
						
							|  |  |  |       sunset_time_now = arrow.get(weather.get_sunset_time()).to(get_tz()) | 
					
						
							|  |  |  |       humidity_now = str(weather.get_humidity()) | 
					
						
							|  |  |  |       cloudstatus_now = str(weather.get_clouds()) | 
					
						
							|  |  |  |       weather_description_now = str(weather.get_detailed_status()) | 
					
						
							|  |  |  |       windspeed_now = weather.get_wind(unit='meters_sec')['speed'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beaufort = str([windspeed_to_beaufort.index(_) for _ in | 
					
						
							|  |  |  |         windspeed_to_beaufort if windspeed_now < _][0]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Calculate the moon phase""" | 
					
						
							|  |  |  |       def get_moon_phase(): | 
					
						
							|  |  |  |        diff = now - arrow.get(2001, 1, 1) | 
					
						
							|  |  |  |        days = dec(diff.days) + (dec(diff.seconds) / dec(86400)) | 
					
						
							|  |  |  |        lunations = dec("0.20439731") + (days * dec("0.03386319269")) | 
					
						
							|  |  |  |        position = lunations % dec(1) | 
					
						
							|  |  |  |        index = math.floor((position * dec(8)) + dec("0.5")) | 
					
						
							|  |  |  |        return {0: '\uf095',1: '\uf099',2: '\uf09c',3: '\uf0a0', | 
					
						
							|  |  |  |                4: '\uf0a3',5: '\uf0a7',6: '\uf0aa',7: '\uf0ae' }[int(index) & 7] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       moonphase = get_moon_phase() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Add weather details in column 1""" | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, 'now', text_now_pos, font = font) | 
					
						
							|  |  |  |       write_text(icon_medium, icon_medium, weathericons[weather_icon_now], | 
					
						
							|  |  |  |         weather_icon_now_pos, font = w_font, fill_width = 0.9) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Add weather details in column 2""" | 
					
						
							|  |  |  |       write_text(icon_small, icon_small, '\uf053', temperature_icon_now_pos, | 
					
						
							|  |  |  |         font = w_font, fill_height = 0.9) | 
					
						
							|  |  |  |       write_text(icon_small, icon_small, '\uf07a', humidity_icon_now_pos, | 
					
						
							|  |  |  |         font = w_font, fill_height = 0.9) | 
					
						
							|  |  |  |       write_text(icon_small, icon_small, '\uf050', windspeed_icon_now_pos, | 
					
						
							|  |  |  |         font = w_font, fill_height = 0.9) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       write_text(coloumn_width-icon_small, row_height, | 
					
						
							|  |  |  |         temperature_now, temperature_now_pos, font = font) | 
					
						
							|  |  |  |       write_text(coloumn_width-icon_small, row_height, humidity_now+'%', | 
					
						
							|  |  |  |         humidity_now_pos, font = font) | 
					
						
							|  |  |  |       write_text(coloumn_width-icon_small, row_height, beaufort, | 
					
						
							|  |  |  |         windspeed_now_pos, font = font) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Add weather details in column 3""" | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, moonphase , moon_phase_now_pos, | 
					
						
							|  |  |  |         font = w_font, fill_height = 0.9) | 
					
						
							|  |  |  |       write_text(icon_small, icon_small, '\uf051', sunrise_icon_now_pos, | 
					
						
							|  |  |  |         font = w_font, fill_height = 0.9) | 
					
						
							|  |  |  |       write_text(icon_small, icon_small, '\uf052', sunset_icon_now_pos, | 
					
						
							|  |  |  |         font = w_font, fill_height = 0.9) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       write_text(coloumn_width-icon_small, row_height, | 
					
						
							|  |  |  |         to_hours(sunrise_time_now), sunrise_time_now_pos, font = font, | 
					
						
							|  |  |  |                  fill_width = 0.9) | 
					
						
							|  |  |  |       write_text(coloumn_width-icon_small, row_height, | 
					
						
							|  |  |  |         to_hours(sunset_time_now), sunset_time_now_pos, font = font, | 
					
						
							|  |  |  |                  fill_width = 0.9) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Add weather details in column 4""" | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, to_hours(fc1, simple=True), | 
					
						
							|  |  |  |         text_fc1_pos, font = font) | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, weathericons[weather_icon_fc1], | 
					
						
							|  |  |  |         icon_fc1_pos, font = w_font, fill_height = 1.0) | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, temperature_fc1, | 
					
						
							|  |  |  |           temperature_fc1_pos, font = font) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Add weather details in column 5""" | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, to_hours(fc2, simple=True), | 
					
						
							|  |  |  |         text_fc2_pos, font = font) | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, weathericons[weather_icon_fc2], | 
					
						
							|  |  |  |         icon_fc2_pos, font = w_font, fill_height = 1.0) | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, temperature_fc2, | 
					
						
							|  |  |  |           temperature_fc2_pos, font = font) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Add weather details in column 6""" | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, to_hours(fc3, simple=True), | 
					
						
							|  |  |  |         text_fc3_pos, font = font) | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, weathericons[weather_icon_fc3], | 
					
						
							|  |  |  |         icon_fc3_pos, font = w_font, fill_height = 1.0) | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, temperature_fc3, | 
					
						
							|  |  |  |           temperature_fc3_pos, font = font) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Add weather details in last coloumn""" | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, to_hours(fc4, simple=True), | 
					
						
							|  |  |  |         text_fc4_pos, font = font) | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, weathericons[weather_icon_fc4], | 
					
						
							|  |  |  |         icon_fc4_pos, font = w_font, fill_height = 1.0) | 
					
						
							|  |  |  |       write_text(coloumn_width, row_height, temperature_fc4, | 
					
						
							|  |  |  |           temperature_fc4_pos, font = font) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       """Add vertical lines between forecast sections""" | 
					
						
							|  |  |  |       draw = ImageDraw.Draw(image) | 
					
						
							|  |  |  |       line_start_y = int(top_section_height*0.1) | 
					
						
							|  |  |  |       line_end_y = int(top_section_height*0.9) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       draw.line((coloumn4, line_start_y, coloumn4, line_end_y), fill='black') | 
					
						
							|  |  |  |       draw.line((coloumn5, line_start_y, coloumn5, line_end_y), fill='black') | 
					
						
							|  |  |  |       draw.line((coloumn6, line_start_y, coloumn6, line_end_y), fill='black') | 
					
						
							|  |  |  |       draw.line((coloumn7, line_start_y, coloumn7, line_end_y), fill='black') | 
					
						
							|  |  |  |       draw.line((0, top_section_height-border_top, top_section_width- | 
					
						
							|  |  |  |         border_left, top_section_height-border_top), | 
					
						
							|  |  |  |         fill='red' if display_type == 'colour' else 'black' , width=3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       weather_image = image.crop((0,0, top_section_width, top_section_height))     | 
					
						
							|  |  |  |       weather_image.save(image_path+'weather.png') | 
					
						
							|  |  |  |       print('Done') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     except Exception as e: | 
					
						
							|  |  |  |       """If no response was received from the openweathermap
 | 
					
						
							|  |  |  |       api server, add the cloud with question mark"""
 | 
					
						
							|  |  |  |       print('__________OWM-ERROR!__________') | 
					
						
							|  |  |  |       print('Reason: ',e) | 
					
						
							|  |  |  |       write_text(icon_medium, icon_medium, '\uf07b', weather_icon_now_pos, | 
					
						
							|  |  |  |       font = w_font, fill_height = 1.0) | 
					
						
							|  |  |  |       message = 'No internet connectivity or API timeout' | 
					
						
							|  |  |  |       write_text(coloumn_width*6, row_height, message, humidity_icon_now_pos, | 
					
						
							|  |  |  |         font = font) | 
					
						
							|  |  |  |       pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |   main() |