Compare commits
2 Commits
3333871947
...
9c60f7c37b
| Author | SHA1 | Date | |
|---|---|---|---|
| 9c60f7c37b | |||
| 69eacb4f17 |
1
.env.sample
Normal file
1
.env.sample
Normal file
@@ -0,0 +1 @@
|
|||||||
|
HAS_TOKEN=xxx
|
||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -175,4 +175,7 @@ cython_debug/
|
|||||||
|
|
||||||
|
|
||||||
*.bmp
|
*.bmp
|
||||||
*.png
|
*.png
|
||||||
|
credentials.json
|
||||||
|
|
||||||
|
.env
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
from inky import InkyWHAT
|
from inky import InkyWHAT
|
||||||
from inky.auto import auto
|
from inky.auto import auto
|
||||||
|
from dotenv import load_dotenv
|
||||||
from building import draw_image
|
from building import draw_image
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
display = auto(verbose = True)
|
display = auto(verbose = True)
|
||||||
image = draw_image()
|
image = draw_image()
|
||||||
display.set_image(image)
|
display.set_image(image)
|
||||||
|
|||||||
73
building.py
73
building.py
@@ -1,9 +1,14 @@
|
|||||||
from PIL import Image
|
from PIL import Image
|
||||||
from PIL import ImageDraw
|
from PIL import ImageDraw
|
||||||
from PIL import ImageFont
|
from PIL import ImageFont
|
||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
from time import gmtime, strftime
|
from time import gmtime, strftime
|
||||||
import time
|
import time
|
||||||
|
from googleCalendar import get_events
|
||||||
|
from itertools import groupby
|
||||||
|
from hasApi import get_calendar_events
|
||||||
|
import dateutil.parser
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
black = '#000000'
|
black = '#000000'
|
||||||
white = '#ffffff'
|
white = '#ffffff'
|
||||||
@@ -15,6 +20,8 @@ fontLarge = ImageFont.truetype ("Nunito-ExtraLight.ttf", 18)
|
|||||||
fontSmall = ImageFont.truetype ("Nunito-ExtraLight.ttf", 16)
|
fontSmall = ImageFont.truetype ("Nunito-ExtraLight.ttf", 16)
|
||||||
fontVerySmall = ImageFont.truetype("Nunito-ExtraLight.ttf", 10)
|
fontVerySmall = ImageFont.truetype("Nunito-ExtraLight.ttf", 10)
|
||||||
|
|
||||||
|
class Space(Exception): pass
|
||||||
|
|
||||||
def getsize(font, text):
|
def getsize(font, text):
|
||||||
_, _, right, bottom = font.getbbox(text)
|
_, _, right, bottom = font.getbbox(text)
|
||||||
return (right, bottom)
|
return (right, bottom)
|
||||||
@@ -45,22 +52,22 @@ def draw_image():
|
|||||||
|
|
||||||
# Draw the top bar
|
# Draw the top bar
|
||||||
draw.rectangle((0, 0, 400, 300), fill=white)
|
draw.rectangle((0, 0, 400, 300), fill=white)
|
||||||
draw.rectangle((0, 0, 400, 40), fill=black)
|
draw.rectangle((0, 0, 400, 30), fill=black)
|
||||||
|
|
||||||
# Add the clock
|
# Add the clock
|
||||||
timeStr = strftime("%H:%M", time.localtime())
|
timeStr = strftime("%H:%M", time.localtime())
|
||||||
draw.text((10, 10), timeStr, white, fontSmall)
|
draw.text((10, 5), timeStr, white, fontSmall)
|
||||||
|
|
||||||
# Add indoor tempriture
|
# Add indoor tempriture
|
||||||
draw.text((350, 10), "19c", white, fontSmall)
|
draw.text((350, 5), "19c", white, fontSmall)
|
||||||
|
|
||||||
# Add sections
|
# Add sections
|
||||||
ep = 5
|
ep = 5
|
||||||
draw.rounded_rectangle((ep, 40+ep, (400/2)-ep, 300-ep), 10, outline=black)
|
draw.rounded_rectangle((ep, 30+ep, (400/2)-ep, 300-ep), 10, outline=black, width=2)
|
||||||
draw.rounded_rectangle(((400/2) + ep, 40+ep, 400-ep, 300-ep), 10, outline=black)
|
draw.rounded_rectangle(((400/2) + ep, 30+ep, 400-ep, 300-ep), 10, outline=black, width=2)
|
||||||
|
|
||||||
# Add tasks
|
# Add tasks
|
||||||
draw.text((15, 50), 'Tasks', black, fontTitle)
|
draw.text((15, 40), 'Tasks', black, fontTitle)
|
||||||
|
|
||||||
tasks = [
|
tasks = [
|
||||||
{'done': False, 'title': 'Something'},
|
{'done': False, 'title': 'Something'},
|
||||||
@@ -69,12 +76,12 @@ def draw_image():
|
|||||||
{'done': False, 'title': 'Call locksmith'},
|
{'done': False, 'title': 'Call locksmith'},
|
||||||
]
|
]
|
||||||
|
|
||||||
taskStart = 90
|
taskStart = 80
|
||||||
for task in tasks:
|
for task in tasks:
|
||||||
if task['done']:
|
if task['done']:
|
||||||
draw.text((15, taskStart), '', black, fontSymbols)
|
draw.text((15, taskStart-2), '', black, fontSymbols)
|
||||||
else:
|
else:
|
||||||
draw.text((15, taskStart), '', black, fontSymbols)
|
draw.text((15, taskStart-2), '', black, fontSymbols)
|
||||||
|
|
||||||
reflowedTitle = reflow_quote(task['title'], 170, fontLarge)
|
reflowedTitle = reflow_quote(task['title'], 170, fontLarge)
|
||||||
titleSizeW, titleSizeH = getsize(fontLarge, reflowedTitle)
|
titleSizeW, titleSizeH = getsize(fontLarge, reflowedTitle)
|
||||||
@@ -83,8 +90,54 @@ def draw_image():
|
|||||||
draw.text((35, taskStart - 3), reflowedTitle, black, fontLarge)
|
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)
|
||||||
|
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()
|
||||||
|
else:
|
||||||
|
print('Error')
|
||||||
|
print(start)
|
||||||
|
return None
|
||||||
|
if startDate < datetime.today().date():
|
||||||
|
return datetime.today().date()
|
||||||
|
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'
|
||||||
|
else:
|
||||||
|
dateStr = key.strftime('%d %b')
|
||||||
|
|
||||||
|
draw.text((215, itemStart), dateStr, black, fontLarge)
|
||||||
|
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)
|
||||||
|
# print(f'After {reflowedItem}, {itemStart + h}')
|
||||||
|
if itemStart + h > 270: raise Space
|
||||||
|
draw.text((230, itemStart), reflowedItem, black, fontSmall)
|
||||||
|
itemStart += h + (ep)
|
||||||
|
|
||||||
|
if itemStart > 250: raise Space
|
||||||
|
except Space:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
return image
|
return image
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
load_dotenv()
|
||||||
img = draw_image()
|
img = draw_image()
|
||||||
img.save('built.bmp')
|
img.save('built.bmp')
|
||||||
22
hasApi.py
Normal file
22
hasApi.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import requests
|
||||||
|
import datetime
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
import os
|
||||||
|
|
||||||
|
def get_calendar_events():
|
||||||
|
token = os.getenv('HAS_TOKEN')
|
||||||
|
if not 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)
|
||||||
|
return response.json()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
load_dotenv()
|
||||||
|
events = get_calendar_events()
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
pillow
|
pillow
|
||||||
inky
|
inky
|
||||||
imgkit
|
imgkit
|
||||||
|
requests
|
||||||
|
python-dotenv
|
||||||
Reference in New Issue
Block a user