diff --git a/README.md b/README.md new file mode 100644 index 0000000..2888bf5 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +## Installation + +```bash +sudo apt update +sudo apt install python3-pip + +git clone https://github.com/pimoroni/inky +cd inky +./install.sh + +python3 -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +``` diff --git a/building.py b/building.py index dece31a..18ce395 100644 --- a/building.py +++ b/building.py @@ -5,29 +5,34 @@ from datetime import datetime, timedelta from time import gmtime, strftime import time from itertools import groupby -from hasApi import get_calendar_events +from hasApi import get_calendar_events, get_todo_items import dateutil.parser from dotenv import load_dotenv -black = '#000000' -white = '#ffffff' +black = "#000000" +white = "#ffffff" fontSymbols = ImageFont.truetype("SymbolsNerdFont-Regular.ttf", 18) fontTitle = ImageFont.truetype("Nunito-SemiBold.ttf", 24) -fontLarge = ImageFont.truetype ("Nunito-ExtraLight.ttf", 18) -fontSmall = ImageFont.truetype ("Nunito-ExtraLight.ttf", 16) +fontLarge = ImageFont.truetype("Nunito-ExtraLight.ttf", 18) +fontLargeBold = ImageFont.truetype("Nunito-SemiBold.ttf", 18) +fontSmall = ImageFont.truetype("Nunito-ExtraLight.ttf", 16) fontVerySmall = ImageFont.truetype("Nunito-ExtraLight.ttf", 10) -class Space(Exception): pass + +class Space(Exception): + pass + def getsize(font, text): _, _, right, bottom = font.getbbox(text) return (right, bottom) + def reflow_quote(quote, width, font): words = quote.split(" ") - reflowed = '' + reflowed = "" line_length = 0 for i in range(len(words)): @@ -45,6 +50,7 @@ def reflow_quote(quote, width, font): return reflowed + def draw_image(): image = Image.new("P", (400, 300)) draw = ImageDraw.Draw(image) @@ -61,82 +67,86 @@ def draw_image(): draw.text((350, 5), "19c", white, fontSmall) # Add sections - ep = 5 - draw.rounded_rectangle((ep, 30+ep, (400/2)-ep, 300-ep), 10, outline=black, width=2) - draw.rounded_rectangle(((400/2) + ep, 30+ep, 400-ep, 300-ep), 10, outline=black, width=2) + ep = 3 + draw.rounded_rectangle( + (ep, 30 + ep, (400 / 2) - ep, 300 - ep), 10, outline=black, width=2 + ) + draw.rounded_rectangle( + ((400 / 2) + ep, 30 + ep, 400 - ep, 300 - ep), 10, outline=black, width=2 + ) # Add tasks - draw.text((15, 40), 'Tasks', black, fontTitle) + draw.text((15, 40), "Tasks", black, fontTitle) - tasks = [ - {'done': False, 'title': 'Something'}, - {'done': True, 'title': 'Get the Modus and Audi MOTs organised'}, - {'done': False, 'title': 'Something else'}, - {'done': False, 'title': 'Call locksmith'}, - ] + tasks = get_todo_items() taskStart = 80 for task in tasks: - if task['done']: - draw.text((15, taskStart-2), '󰄵', black, fontSymbols) + if task["status"] == "completed": + continue + draw.text((15, taskStart - 2), "󰄵", black, fontSymbols) else: - draw.text((15, taskStart-2), '󰄱', black, fontSymbols) + draw.text((15, taskStart), "󰄱", black, fontSymbols) - reflowedTitle = reflow_quote(task['title'], 170, fontLarge) + reflowedTitle = reflow_quote(task["summary"], 160, fontLarge) titleSizeW, titleSizeH = getsize(fontLarge, reflowedTitle) - titleSizeH *= (reflowedTitle.count('\n') + 1) + titleSizeH *= reflowedTitle.count("\n") + 1 draw.text((35, taskStart - 3), reflowedTitle, black, fontLarge) - taskStart += titleSizeH + (2*ep) + taskStart += titleSizeH + (2 * ep) # Add cal - draw.text((215, 40), 'Calendar', black, fontTitle) + draw.text((215, 40), "Calendar", black, fontTitle) events = get_calendar_events() + def get_start_date(x): - start = x['start'] - if 'date' in start: - startDate = datetime.strptime(start['date'], '%Y-%m-%d').date() - elif 'dateTime' in start: - startDate = datetime.strptime(start['dateTime'][:10], '%Y-%m-%d').date() + start = x["start"] + if "date" in start: + startDate = datetime.strptime(start["date"], "%Y-%m-%d").date() + elif "dateTime" in start: + startDate = datetime.strptime(start["dateTime"][:10], "%Y-%m-%d").date() else: - print('Error') + print("Error") print(start) return None if startDate < datetime.today().date(): return datetime.today().date() - else: return startDate - + else: + return startDate + itemStart = 80 try: for key, group in groupby(events, get_start_date): - if key == datetime.today().date(): - dateStr = 'Today' - elif key == (datetime.today() + timedelta(days = 1)).date(): - dateStr = 'Tomorrow' + if key == datetime.today().date(): + dateStr = "Today" + elif key == (datetime.today() + timedelta(days=1)).date(): + dateStr = "Tomorrow" else: - dateStr = key.strftime('%d %b') + dateStr = key.strftime("%d %b") - draw.text((215, itemStart), dateStr, black, fontLarge) - w, h = getsize(fontLarge, 'Today') + draw.text((215, itemStart), dateStr, black, fontLargeBold) + w, h = getsize(fontLarge, "Today") itemStart += h + (ep) - + for thing in list(group): - reflowedItem = reflow_quote(thing['summary'], 170, fontSmall) - w, h = getsize(fontLarge, 'Today') - h *= (reflowedItem.count('\n') + 1) + reflowedItem = reflow_quote(thing["summary"], 170, fontSmall) + w, h = getsize(fontLarge, "Today") + h *= reflowedItem.count("\n") + 1 # print(f'After {reflowedItem}, {itemStart + h}') - if itemStart + h > 270: raise Space + if itemStart + h > 270: + raise Space draw.text((230, itemStart), reflowedItem, black, fontSmall) itemStart += h + (ep) - - if itemStart > 250: raise Space + + if itemStart > 250: + raise Space except Space: pass - return image + if __name__ == "__main__": load_dotenv() img = draw_image() - img.save('built.bmp') \ No newline at end of file + img.save("built.bmp") diff --git a/dev_reqs.txt b/dev_reqs.txt new file mode 100644 index 0000000..a9d0a09 --- /dev/null +++ b/dev_reqs.txt @@ -0,0 +1,5 @@ +pillow +imgkit +requests +python-dotenv +python-dateutil \ No newline at end of file diff --git a/hasApi.py b/hasApi.py index 0f1529e..5fdf305 100644 --- a/hasApi.py +++ b/hasApi.py @@ -3,20 +3,46 @@ import datetime from dotenv import load_dotenv import os + def get_calendar_events(): - token = os.getenv('HAS_TOKEN') + token = os.getenv("HAS_TOKEN") if not token: - raise Exception('Missing HAS token') - + raise Exception("Missing HAS token") + headers = {"Authorization": f"Bearer {token}"} payload = { - 'start': datetime.datetime.now().strftime('%Y-%m-%d'), - 'end': (datetime.datetime.now() + datetime.timedelta(days=14)).strftime('%Y-%m-%d')} - response = requests.get('https://has.nozzy.online/api/calendars/calendar.romosborne_gmail_com', - headers=headers, - params=payload) + "start": datetime.datetime.now().strftime("%Y-%m-%d"), + "end": (datetime.datetime.now() + datetime.timedelta(days=14)).strftime( + "%Y-%m-%d" + ), + } + response = requests.get( + "https://has.nozzy.online/api/calendars/calendar.romosborne_gmail_com", + headers=headers, + params=payload, + ) return response.json() + +def get_todo_items(): + token = os.getenv("HAS_TOKEN") + if not token: + raise Exception("Missing HAS token") + headers = {"Authorization": f"Bearer {token}"} + payload = {"entity_id": "todo.todo_2"} + params = {"return_response": "null"} + response = requests.post( + "https://has.nozzy.online/api/services/todo/get_items", + headers=headers, + params=params, + json=payload, + ) + data = response.json() + return data["service_response"]["todo.todo_2"]["items"] + + if __name__ == "__main__": load_dotenv() - events = get_calendar_events() + events = get_todo_items() + for item in events: + print(item["summary"])