From fa659f17c5f018b953a97499b27a6f70dc4eb74a Mon Sep 17 00:00:00 2001 From: Ace Date: Fri, 3 May 2019 20:47:36 +0200 Subject: [PATCH] Added connectivity check in iCalendar section --- Calendar/E-Paper.py | 100 +++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/Calendar/E-Paper.py b/Calendar/E-Paper.py index 3208804..87458a0 100644 --- a/Calendar/E-Paper.py +++ b/Calendar/E-Paper.py @@ -91,6 +91,13 @@ def main(): ImageDraw.Draw(space).text((x, y), text, fill='black', font=font) image.paste(space, tuple) + def internet_available(): + try: + urlopen('https://google.com',timeout=5) + return True + except URLError as err: + return False + """Connect to Openweathermap API and fetch weather data""" if top_section is "Weather" and api_key != "" and owm.is_API_online() is True: print("Connecting to Openweathermap API servers...") @@ -164,7 +171,7 @@ def main(): """Using the built-in calendar to generate the monthly Calendar template""" cal = calendar.monthcalendar(time.year, time.month) - + if middle_section is "Calendar": """Add the icon with the current month's name""" image.paste(im_open(mpath+str(time.strftime("%B")+'.jpeg')), monthplace) @@ -278,7 +285,6 @@ def main(): if middle_section is "Calendar" or "Agenda": """Algorithm for filtering and sorting events from your iCalendar/s""" - print('Fetching events from your calendar'+'\n') events_this_month = [] upcoming = [] now = arrow.now() @@ -288,44 +294,52 @@ def main(): to filter events in that range""" agenda_max_days = arrow.now().replace(days=+22) calendar_max_days = arrow.now().replace(days=+int(events_max_range)) - for icalendars in ical_urls: - decode = str(urlopen(icalendars).read().decode()) - beginAlarmIndex = 0 - while beginAlarmIndex >= 0: - beginAlarmIndex = decode.find('BEGIN:VALARM') - if beginAlarmIndex >= 0: - endAlarmIndex = decode.find('END:VALARM') - decode = decode[:beginAlarmIndex] + decode[endAlarmIndex+12:] - ical = Calendar(decode) - for events in ical.events: - if re.search('RRULE',str(events)) is not None: - r = re.search('RRULE:(.+?)\n',str(events)) - r_start = re.search('DTSTART:(.+?)\n',str(events)) - if r_start is not None: # if r_start is None the format of DTSTART is not recognized - if time.now().month == 12: - r_string=(r.group(1).rstrip()+';UNTIL='+'%04d%02d%02d'+'T000000Z') % (time.now().year+1, 1, 1) - else: - r_string=(r.group(1).rstrip()+';UNTIL='+'%04d%02d%02d'+'T000000Z') % (time.now().year, time.now().month+1, 1) - rule=rrulestr(r_string,dtstart=parse(r_start.group(1))) - for i in rule: - if i.year == time.now().year and i.month == time.now().month and i.day >= time.now().day: - upcoming.append(events) - if i.day not in events_this_month: - events_this_month.append(i.day) - # uncomment this line to see fetched recurring events - #print ("Appended recurring event: " + events.name + " on " + str(time.now().year) + " " + time.now().strftime('%m')+ " " + str(i.day).zfill(2)) - else: - if events.begin.date().year == today.year and events.begin.date().month is today.month and int((events.begin).format('D')) not in events_this_month: - events_this_month.append(int((events.begin).format('D'))) - if middle_section is 'Agenda' and events in ical.timeline.included(now, agenda_max_days): - upcoming.append(events) - if middle_section is 'Calendar' and events in ical.timeline.included(now, calendar_max_days): - upcoming.append(events) + if internet_available() is True: + print('Internet connection test passed'+'\n') + print('Fetching events from your calendar'+'\n') + for icalendars in ical_urls: + decode = str(urlopen(icalendars).read().decode()) + beginAlarmIndex = 0 + while beginAlarmIndex >= 0: + beginAlarmIndex = decode.find('BEGIN:VALARM') + if beginAlarmIndex >= 0: + endAlarmIndex = decode.find('END:VALARM') + decode = decode[:beginAlarmIndex] + decode[endAlarmIndex+12:] + ical = Calendar(decode) + for events in ical.events: + if re.search('RRULE',str(events)) is not None: + r = re.search('RRULE:(.+?)\n',str(events)) + r_start = re.search('DTSTART:(.+?)\n',str(events)) + if r_start is not None: # if r_start is None the format of DTSTART is not recognized + if time.now().month == 12: + r_string=(r.group(1).rstrip()+';UNTIL='+'%04d%02d%02d'+'T000000Z') % (time.now().year+1, 1, 1) + else: + r_string=(r.group(1).rstrip()+';UNTIL='+'%04d%02d%02d'+'T000000Z') % (time.now().year, time.now().month+1, 1) + rule=rrulestr(r_string,dtstart=parse(r_start.group(1))) + for i in rule: + if i.year == time.now().year and i.month == time.now().month and i.day >= time.now().day: + upcoming.append(events) + if i.day not in events_this_month: + events_this_month.append(i.day) + # uncomment this line to see fetched recurring events + #print ("Appended recurring event: " + events.name + " on " + str(time.now().year) + " " + time.now().strftime('%m')+ " " + str(i.day).zfill(2)) + else: + if events.begin.date().year == today.year and events.begin.date().month is today.month and int((events.begin).format('D')) not in events_this_month: + events_this_month.append(int((events.begin).format('D'))) + if middle_section is 'Agenda' and events in ical.timeline.included(now, agenda_max_days): + upcoming.append(events) + if middle_section is 'Calendar' and events in ical.timeline.included(now, calendar_max_days): + upcoming.append(events) - def event_begins(elem): - return elem.begin + def event_begins(elem): + return elem.begin + + upcoming.sort(key=event_begins) + + else: + print("Could not fetch events from your iCalendar.") + print("Either the internet connection is too slow or we're offline.") - upcoming.sort(key=event_begins) if middle_section is 'Agenda': """For the agenda view, create a list containing dates and events of the next 22 days""" @@ -359,7 +373,7 @@ def main(): write_text(384, 25, agenda_list[lines]['value'], agenda_view_lines['line'+str(lines+1)], alignment='left') else: write_text(384, 25, agenda_list[lines]['value'], agenda_view_lines['line'+str(lines+1)]) - + if middle_section is 'Calendar': """Draw smaller squares on days with events""" for numbers in events_this_month: @@ -394,7 +408,7 @@ def main(): for events in range(len(upcoming)): write_text(314, 25, (upcoming[events]['event']), event_positions['e'+str(events+3)], alignment = 'left') - + """ Map all pixels of the generated image to red, white and black so that the image can be displayed 'correctly' on the E-Paper @@ -409,7 +423,7 @@ def main(): if display_colours is "bw": buffer[np.logical_and(r > 240, g > 240)] = [255,255,255] #white buffer[g < 255] = [0,0,0] #black - + improved_image = Image.fromarray(buffer).rotate(270, expand=True) print('Initialising E-Paper Display') epd.init() @@ -427,7 +441,7 @@ def main(): if bottom_section is 'RSS': del rss_feed del news - + if middle_section is 'Agenda': del agenda_list @@ -450,7 +464,7 @@ def main(): for update_times in timings: if update_times >= mins: sleep_for_minutes = update_times - mins - + next_update_countdown = sleep_for_minutes*60 + (60-seconds) print(sleep_for_minutes,'Minutes and ', (60-seconds),'Seconds left until next loop')