from datetime import datetime, timedelta, timezone from PIL import Image, ImageDraw, ImageFont import cache import ptv # Data now = datetime.now(timezone.utc) with cache.open() as c: ptv_data = { k: (v - now) // timedelta(minutes=1) if v else '-' for k, v in ptv.get_departure_data(now, c).items() } BLACK = 0x000000 # 00 BGR WHITE = 0xffffff # 01 YELLOW = 0x00ffff # 10 RED = 0x0000ff # 11 fontstd = ImageFont.truetype('assets/NETWORKSANS-2019-REGULAR.TTF', 64) fontmins = ImageFont.truetype('assets/NETWORKSANS-2019-BOLD.TTF', 96) fonttime = ImageFont.truetype('assets/NETWORKSANS-2019-REGULAR.TTF', 92) fontmm = ImageFont.truetype('assets/NETWORKSANS-2019-REGULAR.TTF', 20) fonthigh = ImageFont.truetype('assets/NETWORKSANS-2019-REGULAR.TTF', 42) image = Image.new('RGB', (800, 480), WHITE) draw = ImageDraw.Draw(image) # Backing image with Image.open('assets/ui test 3.png').convert('RGBA') as bg: image.paste(bg, (0, 0)) # Time timehour = f'{now:%H}' timemin = f'{now:%M}' timehourlength = draw.textlength(timehour, font=fonttime)-3 timeminstart = timehourlength + draw.textlength(':', font=fonttime)-3 draw.text((-3, 480-3), timehour, font=fonttime, anchor="ls", fill=WHITE) draw.text((timehourlength, 480-12), f':', font=fonttime, anchor="ls", fill=WHITE) draw.text((timeminstart, 480-3), timemin, font=fonttime, anchor="ls", fill=WHITE) # Date dateday = f'{now:%d}' datedaylength = draw.textlength(dateday, font=fontstd) draw.text((-3, 320), dateday, font=fontstd, anchor="ls", fill=WHITE) draw.text((datedaylength + 5, 320), f'{now:%b}', font=fontstd, anchor="lt", fill=WHITE) # Temperature temp = 6 temphigh = 6 draw.text((-3, 200), f'{temp}°', font=fontstd, anchor="ls", fill=WHITE) draw.text((124, 238), f'{temphigh}', font=fonthigh, anchor="ms", fill=WHITE) # Rainfall rainfall = 6 rainthreshold = 5 if rainfall > rainthreshold: rainimgpath = 'assets/rain.png' else: rainimgpath = 'assets/sun.png' draw.text((40, 0), f'{rainfall}', font=fontstd, anchor="mt") with Image.open(rainimgpath) as rainimg: image.paste(rainimg, mask=rainimg) draw.text((40, 55), f'mm', font=fontmm, anchor="mt") # ETAs leftminsx = 375 centerminsx = 545 rightminsx = 715 busminsy = 75 trainminsy = 235 tramminsy = 395 draw.text((leftminsx, busminsy), f'{ptv_data["612 S"]}', font=fontmins, anchor="mt", fill=BLACK) draw.text((centerminsx, busminsy), f'{ptv_data["612 N"]}', font=fontmins, anchor="mt", fill=BLACK) draw.text((rightminsx, busminsy), f'{ptv_data["766 N"]}', font=fontmins, anchor="mt", fill=BLACK) draw.text((leftminsx, trainminsy), f'{ptv_data["Union W Express"]}', font=fontmins, anchor="mt", fill=BLACK) draw.text((centerminsx, trainminsy), f'{ptv_data["Union W"]}', font=fontmins, anchor="mt", fill=BLACK) draw.text((rightminsx, trainminsy), f'{ptv_data["Union E"]}', font=fontmins, anchor="mt", fill=BLACK) draw.text((centerminsx, tramminsy), f'{ptv_data["109 W"]}', font=fontmins, anchor="mt", fill=BLACK) draw.text((rightminsx, tramminsy), f'{ptv_data["70 W"]}', font=fontmins, anchor="mt", fill=BLACK) image.save('test_before_palette.png') # Dither into eink palette pal_image = Image.new('P', (1, 1)) pal_image.putpalette((0x00,0x00,0x00, 0xff,0xff,0xff, 0xff,0xff,0x00, 0xff,0x00,0x00) + (0x00,0x00,0x00)*252) # Convert the source image to the 4 colors, dithering if needed image_4color = image.quantize(palette=pal_image, dither=Image.NONE) image_4color.save('test_after_palette.png') show_on_screen = False if show_on_screen: import epd7in3g as epd try: epd.init() epd.display(epd.get_buffer(image)) input('Press Enter to clear') finally: epd.clear() epd.epdconfig.module_exit(cleanup=True)