diff --git a/Calendar/stable.py b/Calendar/stable.py index 3956151..0ef5be0 100755 --- a/Calendar/stable.py +++ b/Calendar/stable.py @@ -8,7 +8,9 @@ If you have any questions, feel free to open an issue at Github. Copyright by Ace-Laboratory """ +print('importing modules'+'\n') from settings import * +from icon_positions_locations import * from PIL import Image, ImageDraw, ImageFont, ImageOps import calendar, pyowm @@ -29,59 +31,11 @@ if display_colours == "bw": epd = epd7in5.EPD() from calibration_bw import calibration -if (week_starts_on == "Monday"): - calendar.setfirstweekday(calendar.MONDAY) - -if (week_starts_on == "Sunday"): - calendar.setfirstweekday(calendar.Sunday) - c = Calendar(urlopen(url).read().decode('UTF-8')) e = Event() -open = Image.open EPD_WIDTH = 640 EPD_HEIGHT = 384 -path = '/home/pi/E-Paper-Master/Calendar/' -wpath = path+'weather-icons/' -mpath = path+'months/'+language+'/' -dpath = path+'days/' -opath = path+'other/'+language+'/' -font = ImageFont.truetype(path+'Assistant-Bold.ttf', 18) - -weekday = open(opath+'weekday.bmp') -eventicon = open(opath+'event.bmp') -dateicon = open(opath+'today.bmp') -tempicon = open(opath+'temp-icon.bmp') -humicon = open(opath+'hum-icon.bmp') -weekmon = open(opath+'week-mon.bmp') -weeksun = open(opath+'week-sun.bmp') -seperator = open(opath+'seperator.bmp') - -wiconplace = (570, 219) -tempplace = (605, 310) -humplace = (572, 308) -monthplace = (443, 0) -weekplace = (415,0) -seperator_place = (555, 0) - -weekdaysmon = {'Mon': (416,3), 'Tue': (416,57), 'Wed': (416,111), 'Thu': (416,165), 'Fri': (416,219), 'Sat': (416,273), 'Sun':(416,327)} -weekdayssun = {'Sun': (416,3), 'Mon': (416,57), 'Tue': (416,111), 'Wed': (416,165), 'Thu': (416,219), 'Fri': (416,273), 'Sat':(416,327)} - -positions = {'a1': (351, 3), 'a2': (351, 57), 'a3': (351, 111), 'a4': (351, 165), 'a5': (351, 219), 'a6': (351, 273), 'a7': (351, 327), -'b1': (284, 3), 'b2': (284, 57), 'b3': (284, 111), 'b4': (284, 165), 'b5': (284, 219), 'b6': (284, 273), 'b7': (284, 327), -'c1': (217, 3), 'c2': (217, 57), 'c3': (217, 111), 'c4': (217, 165), 'c5': (217, 219), 'c6': (217, 273), 'c7': (217, 327), -'d1': (150, 3), 'd2': (150, 57), 'd3': (150, 111), 'd4': (150, 165), 'd5': (150, 219), 'd6': (150, 273), 'd7': (150, 327), -'e1': (83, 3), 'e2': (83, 57), 'e3': (83, 111), 'e4': (83, 165), 'e5': (83, 219), 'e6': (83, 273), 'e7': (83, 327), -'f1': (16, 3), 'f2': (16, 57), 'f3': (16, 111), 'f4': (16, 165), 'f5': (16, 219), 'f6': (16, 273), 'f7': (16, 327)} - -weathericons = {'01d': 'wi-day-sunny', '02d':'wi-day-cloudy', '03d': 'wi-cloudy', -'04d': 'wi-cloudy-windy', '09d': 'wi-showers', '10d':'wi-rain', -'11d':'wi-thunderstorm', '13d':'wi-snow', '50d': 'wi-fog', -'01n': 'wi-night-clear', '02n':'wi-night-cloudy', -'03n': 'wi-night-cloudy', '04n': 'wi-night-cloudy', -'09n': 'wi-night-showers', '10n':'wi-night-rain', -'11n':'wi-night-thunderstorm', '13n':'wi-night-snow', -'50n': 'wi-night-alt-cloudy-windy'} def main(): while True: @@ -90,30 +44,41 @@ def main(): hour = int(time.strftime("%-H")) for i in range(1): - if hour is 0: + """At the following hours (midnight, midday and 6 pm), perform + a calibration of the display's colours""" + if (hour is 0) or (hour is 12) or (hour is 18): + print('performing calibration now') calibration() - if hour is 12: - calibration() - if hour is 18: - calibration() - epd.init() + + print('Current date:',time.strftime('%a %-d %b %y')) + print('Current time:', time.strftime('%H:%M')+'\n') + + """Create a blank page""" image = Image.new('L', (EPD_WIDTH, EPD_HEIGHT), 255) draw = (ImageDraw.Draw(image)).bitmap - - #background image + + """Draw the icon showing the current month""" draw(monthplace, Image.open(mpath+str(time.strftime("%B"))+'.bmp')) - if calendar.firstweekday() == 0: - #print('Your week starts on Monday') #->debug - draw(weekplace, weekmon) - - if calendar.firstweekday() == 6: - #print('Your week starts on Sunday') #->debug - draw(weekplace, weeksun) - - draw(seperatorplace, seperator) + """Draw the 3 lines that seperates the top section""" + draw(seperatorplace, seperator) + """Draw the icons with the weekday-names (Mon, Tue...) and + draw a circle on the current weekday""" + if (week_starts_on == "Monday"): + calendar.setfirstweekday(calendar.MONDAY) + draw(weekplace, weekmon) + draw(weekdaysmon[(time.strftime("%a"))], weekday) + + if (week_starts_on == "Sunday"): + calendar.setfirstweekday(calendar.SUNDAY) + draw(weekplace, weeksun) + draw(weekdayssun[(time.strftime("%a"))], weekday) + + """Using the built-in calendar function, draw icons for each + number of the month (1,2,3,...28,29,30)""" cal = calendar.monthcalendar(time.year, time.month) + #print(cal) #-uncomment for debugging with incorrect dates for i in cal[0]: draw(positions['a'+str(cal[0].index(i)+1)] ,open(dpath+str(i)+'.bmp')) @@ -131,74 +96,69 @@ def main(): except IndexError: pass - # openweathermap api + """ Handling Openweathermap API""" try: - print("Before fetching owm data") + print("Preparing to fetch data from openweathermap API") owm = pyowm.OWM(api_key) observation = owm.weather_at_place(location) print("Fetching weather data...") weather = observation.get_weather() weathericon = weather.get_weather_icon_name() + + Temperature = str(int(weather.get_temperature(unit='celsius')['temp'])) + Humidity = str(weather.get_humidity()) + print('temperature: '+Temperature +' °C') + print('humidity: '+Humidity+'%') + print('fetched icon code: '+weathericon) + print('equivalent to icon: '+weathericons[weathericon]+'\n') + + """Drawing the fetched weather icon""" + draw(wiconplace, open(wpath+weathericons[weathericon]+'.bmp')) + + """Drawing the fetched temperature""" + space2 = Image.new('1', (50,35), color=255) + temperature = ImageDraw.Draw(space2) + temperature.text((2, 8), (Temperature + " °C"), fill=0 ,font=font) + rotate2 = space2.rotate(270, expand=1) + image.paste(rotate2, (605,334)) + + """Drawing the fetched humidity""" + space3 = Image.new('1', (50,35), color=255) + humidity = ImageDraw.Draw(space3) + humidity.text((4, 8), (Humidity +'%'), fill=0 ,font=font) + rotate3 = space3.rotate(270, expand=1) + image.paste(rotate3, (570,334)) + except Exception as e: template = "An exception of type {0} occurred. Arguments:\n{1!r}" message = template.format(type(ex).__name__, ex.args) print(message) print("************ OWM DID NOT RESPOND *************") + print("Drawing the 'no-response' icon on the display now") + draw(wiconplace, no_response) pass - Temperature = str(int(weather.get_temperature(unit='celsius')['temp'])) - Humidity = str(weather.get_humidity()) - print('temp: '+Temperature +' °C') #->debug - print('humidity: '+Humidity+'%') #->debug - print(weathericon) #->debug - - #weather icon handler - draw(wiconplace, open(wpath+weathericons[weathericon]+'.bmp')) - # date writing function + """Drawing today's date at the top left corner""" space1=Image.new('1', (115,25), color=255) - measure1= ImageDraw.Draw(space1) date = ImageDraw.Draw(space1) date.text((2, 3), (time.strftime('%a %-d %b %y')), font=font, fill=0) rotate1 = space1.rotate(270, expand=1) image.paste(rotate1, (595,20)) - # temperature writing function - space2 = Image.new('1', (50,35), color=255) - measure2= ImageDraw.Draw(space2) - temperature = ImageDraw.Draw(space2) - temperature.text((2, 8), (Temperature + " °C"), fill=0 ,font=font) - #if you come across a 'Non-ASCII' Syntax error and comment out the line above and uncomment the line below. - #This is for advanced users who want to experiment with encodings. - #temperature.text((2, 8), (Temperature + u'\xb0' + "C"), fill=0 ,font=font) - rotate2 = space2.rotate(270, expand=1) - image.paste(rotate2, (605,334)) - - # humidity writing function - space3 = Image.new('1', (50,35), color=255) - measure3= ImageDraw.Draw(space3) - humidity = ImageDraw.Draw(space3) - humidity.text((4, 8), (Humidity +'%'), fill=0 ,font=font) - rotate3 = space3.rotate(270, expand=1) - image.paste(rotate3, (570,334)) - - # weekday handler - if calendar.firstweekday() == 0: - draw(weekdaysmon[(time.strftime("%a"))], weekday) - - if calendar.firstweekday() == 6: - draw(weekdayssun[(time.strftime("%a"))], weekday) - - print('It is currently:',time.strftime('%a %-d %b %y')) #--debug - print('The current time is:', time.strftime('%H:%M')) #--debug - + """Sort the Events in your iCalendar""" + print('Fetching upcoming events from your calendar') elist = [] for events in c.events: - if str(time.year) in str((events.begin).format('YYYY')): - if str(time.month) in str((events.begin).format('M')): + if time.year <= int((events.begin).format('YYYY')): + if time.month == int((events.begin).format('M')): elist.append(int((events.begin).format('D'))) + """Uncomment the next 4 lines to print your events on the console""" +# if time.day <= int((events.begin).format('D')): +# print(events.name+' starts on '+events.begin.format('D '+'MMM '+'YYYY')) +# if time.month < int((events.begin).format('M')): +# print(events.name+' starts on '+events.begin.format('D '+'MMM '+'YYYY')) - print('In this month, you have',len(elist),'Events') - + """Draw circles on any days which include an Event""" for x in elist: if x in cal[0]: draw(positions['a'+str(cal[0].index(x)+1)] ,eventicon) @@ -216,6 +176,8 @@ def main(): except IndexError: pass + + """Draw a square with round corners on the today's date""" today = time.day if today in cal[0]: draw(positions['a'+str(cal[0].index(today)+1)] ,dateicon) @@ -235,10 +197,17 @@ def main(): draw(tempplace, tempicon) draw(humplace, humicon) + + print('\n'+'initialising E-Paper Display') + epd.init() + sleep(5) + print('Converting image to data and sending it to the display...'+'\n') epd.display_frame(epd.get_frame_buffer(image)) # delete the list so deleted events can be removed from the list del elist[:] + print('data sent successfully'+'\n') + print('letting the display sleep until the next hour') epd.sleep() for i in range(1):