From 7f042c6c0a140e0dfb8cbf0310914b1afef39d43 Mon Sep 17 00:00:00 2001 From: Ace Date: Thu, 3 Jan 2019 22:19:52 +0100 Subject: [PATCH] A stable.py file with new features for developers This file contains is a modified version of the main file (stable.py) and is mainly for developers to test out new functions. It contains more features than the stable version but is also not guaranteed to work. Please use at your own risk. --- For-developers-only/stable(beta).py.py | 252 +++++++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 For-developers-only/stable(beta).py.py diff --git a/For-developers-only/stable(beta).py.py b/For-developers-only/stable(beta).py.py new file mode 100644 index 0000000..9e4d44b --- /dev/null +++ b/For-developers-only/stable(beta).py.py @@ -0,0 +1,252 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +""" +E-Paper Software (main script) for the 3-colour and 2-Colour E-Paper display +A full and detailed breakdown for this code can be found in the wiki. +If you have any questions, feel free to open an issue at Github. + +Copyright by aceisace +""" +print('importing modules') +from settings import * +from icon_positions_locations import * + +from PIL import Image, ImageDraw, ImageFont, ImageOps +import calendar, pyowm +from ics import Calendar, Event +from datetime import datetime +from time import sleep +try: + from urllib.request import urlopen +except Exception as e: + print('It seems the network is offline :(') + pass +import arrow +print('modules imported successfully!'+'\n') + +if display_colours == "bwr": + import epd7in5b + epd = epd7in5b.EPD() + from calibration import calibration + +if display_colours == "bw": + import epd7in5 + epd = epd7in5.EPD() + from calibration_bw import calibration + +EPD_WIDTH = 640 +EPD_HEIGHT = 384 +font = ImageFont.truetype(path+'Assistant-Bold.ttf', 18) +im_open = Image.open + +def main(): + while True: + + time = datetime.now() + hour = int(time.strftime("%-H")) + + for i in range(1): + """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 for colours now') + calibration() + + 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 + + """Draw the icon showing the current month""" + draw(monthplace, im_open(mpath+str(time.strftime("%B"))+'.bmp')) + + """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)] ,im_open(dpath+str(i)+'.bmp')) + for i in cal[1]: + draw(positions['b'+str(cal[1].index(i)+1)] ,im_open(dpath+str(i)+'.bmp')) + for i in cal[2]: + draw(positions['c'+str(cal[2].index(i)+1)] ,im_open(dpath+str(i)+'.bmp')) + for i in cal[3]: + draw(positions['d'+str(cal[3].index(i)+1)] ,im_open(dpath+str(i)+'.bmp')) + for i in cal[4]: + draw(positions['e'+str(cal[4].index(i)+1)] ,im_open(dpath+str(i)+'.bmp')) + try: + for i in cal[5]: + draw(positions['f'+str(cal[5].index(i)+1)] ,im_open(dpath+str(i)+'.bmp')) + except IndexError: + pass + + def write_text(a,b, text, c,d):#a,b box-size #c,d box position + w, h = font.getsize(text) + if (w, h) > (a, b): + raise ValueError('Sorry, your text is too big for the box') + else: + x = int((a / 2) - (w / 2)) + y = int((b / 2) - (h / 2)) + space = Image.new('1', (a,b), color=255) + ImageDraw.Draw(space).text((x, y), text, fill=0 ,font=font) + image.paste(space.rotate(270, expand=1), (c,d)) + + + """ Handling Openweathermap API""" + print("Preparing to fetch data from openweathermap API") + owm = pyowm.OWM(api_key) + if owm.is_API_online() is True: #test server connection + 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') + windspeed= str(int(weather.get_wind()['speed'])) + sunrisetime = str(datetime.fromtimestamp(int(weather.get_sunrise_time(timeformat='unix'))).strftime('%H:%M')) + sunsettime = str(datetime.fromtimestamp(int(weather.get_sunset_time(timeformat='unix'))).strftime('%H:%M')) + cloudstatus = str(weather.get_clouds()) + weather_description = (str(weather.get_status())) + print('Current wind speed: '+windspeed+ 'km/h') + print('The sunrise today took take place place at: '+sunrisetime) + print('The sunset today will take place place at: '+sunsettime) + print('The current Cloud condition is: ' + cloudstatus + '%') + print('Weather: '+ weather_description) + + """Drawing the fetched weather icon""" + draw(wiconplace, im_open(wpath+weathericons[weathericon] + '.bmp')) + + """Drawing the fetched temperature""" + draw(tempplace, tempicon) + write_text(50,35, Temperature + " °C", 605, 334) + + """Drawing the fetched humidity""" + draw(humplace, humicon) + write_text(50,35, Humidity + " %", 570, 334) + + """Drawing the fetched sunrise time""" + draw(sunriseplace, sunriseicon) + write_text(50,35, sunrisetime, 605, 250) + + """Drawing the fetched sunset time""" + draw(sunsetplace, sunseticon) + write_text(50,35, sunsettime, 570, 250) + + """Drawing the fetched wind speed""" + draw(windiconspace, windicon) + write_text(75, 35, windspeed+" km/h", 605,135) + + """Write a short weather description""" + write_text(100,35, weather_description, 570, 100) + + else: + draw(wiconplace, no_response) + pass + + """Filter this months events from your iCalendar/s""" + print('Fetching this months events from your calendar') + events_this_month = [] + events_today = [] + + for icalendars in ical_urls: + ical = Calendar(urlopen(icalendars).read().decode()) + for events in ical.events: + if(time.now().strftime('%-m %Y') == (events.begin).format('M YYYY')): + events_this_month.append(int((events.begin).format('D'))) + if time.day == int((events.begin).format('D')): + if events.begin.format('HH '+'mm') == "00 00": #full day events + events_today.append('today: '+events.name) + else: + events_today.append(events.name+' at '+events.begin.format('HH '+'mm')) + + events = len(events_today) + if events == 0: + print('no events today') + elif events == 1: + print(events_today[0]) + elif events == 2: + print(events_today[0]) + print('+ 1 event') + else: + print(events_today[0]) + print('+',events -1, 'events') + + """Draw circles on any days which include an Event""" + for x in events_this_month: + if x in cal[0]: + draw(positions['a'+str(cal[0].index(x)+1)] ,eventicon) + if x in cal[1]: + draw(positions['b'+str(cal[1].index(x)+1)] ,eventicon) + if x in cal[2]: + draw(positions['c'+str(cal[2].index(x)+1)] ,eventicon) + if x in cal[3]: + draw(positions['d'+str(cal[3].index(x)+1)] ,eventicon) + if x in cal[4]: + draw(positions['e'+str(cal[4].index(x)+1)] ,eventicon) + try: + if x in cal[5]: + draw(positions['f'+str(cal[5].index(x)+1)] ,eventicon) + except IndexError: + pass + + """Draw a square with round corners on today's date""" + today = time.day + if today in cal[0]: + draw(positions['a'+str(cal[0].index(today)+1)] ,dateicon) + if today in cal[1]: + draw(positions['b'+str(cal[1].index(today)+1)] ,dateicon) + if today in cal[2]: + draw(positions['c'+str(cal[2].index(today)+1)] ,dateicon) + if today in cal[3]: + draw(positions['d'+str(cal[3].index(today)+1)] ,dateicon) + if today in cal[4]: + draw(positions['e'+str(cal[4].index(today)+1)] ,dateicon) + try: + if today in cal[5]: + draw(positions['f'+str(cal[5].index(today)+1)] ,dateicon) + except IndexError: + pass + + 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 events_this_month[:] + del events_today[:] + print('data sent successfully'+'\n') + print('letting the display sleep until the next hour') + epd.sleep() + + for i in range(1): + nexthour = ((60 - int(time.strftime("%-M")))*60) - (int(time.strftime("%-S"))) + sleep(nexthour) + +if __name__ == '__main__': + main()