bump requirements

fix some minor issues
code cleanup
This commit is contained in:
aceisace 2023-01-10 22:58:01 +01:00
parent 86fa5d51da
commit 24ae6df27e
7 changed files with 96 additions and 95 deletions

View File

@ -45,13 +45,13 @@ Inkycal is fully modular, you can mix and match any modules you like and configu
## Configuring the Raspberry Pi ## Configuring the Raspberry Pi
1. Flash Raspberry Pi OS according to the [instructions](https://www.raspberrypi.org/software/). Leave the SD card plugged in your computer. 1. Flash Raspberry Pi OS according to the [instructions](https://www.raspberrypi.org/software/). Leave the SD card plugged in your computer.
2. Create and download `settings.json` file for Inkycal from the [WEB-UI](https://aceisace.eu.pythonanywhere.com/inkycal-config-v2-0-0) 2. Create and download `settings.json` file for Inkycal from the [WEB-UI](https://aceisace.eu.pythonanywhere.com/inkycal-config-v2-0-0)
4. Download the `ssh` text file from the [WEB-UI](https://aceisace.eu.pythonanywhere.com/create_ssh) 3. Download the `ssh` text file from the [WEB-UI](https://aceisace.eu.pythonanywhere.com/create_ssh)
5. Create and download a WiFi-configuration file (`wpa_supplicant.conf`) from the [WEB-UI](https://aceisace.eu.pythonanywhere.com/setup_wifi) 4. Create and download a WiFi-configuration file (`wpa_supplicant.conf`) from the [WEB-UI](https://aceisace.eu.pythonanywhere.com/setup_wifi)
6. Copy these three downloaded files to the flashed microSD card. On Windows, this is the only visible directory on the SD card. On Linux, copy these files to `/boot` 5. Copy these three downloaded files to the flashed microSD card. On Windows, this is the only visible directory on the SD card. On Linux, copy these files to `/boot`
7. Eject the microSD card from your computer now, insert it in the Raspberry Pi and power the Raspberry Pi. 6. Eject the microSD card from your computer now, insert it in the Raspberry Pi and power the Raspberry Pi.
8. Once the green LED has stopped blinking after ~3 minutes, use an SSH client to connect to the Raspberry Pi. On Windows, you can use PUTTY, but you can also use an SSH App 7. Once the green LED has stopped blinking after ~3 minutes, use an SSH client to connect to the Raspberry Pi. On Windows, you can use PUTTY, but you can also use an SSH App
on your smartphone. Use the address: `raspberrypi.local` with `pi` as the username and `raspberry` as the password. For more detailed instructions, check out the page from the [Raspberry Pi website](https://www.raspberrypi.org/documentation/remote-access/ssh/) on your smartphone. Use the address: `raspberrypi.local` with `pi` as the username and `raspberry` as the password. For more detailed instructions, check out the page from the [Raspberry Pi website](https://www.raspberrypi.org/documentation/remote-access/ssh/)
9. After connecting via SSH, run the following commands, line by line: 8. After connecting via SSH, run the following commands, line by line:
```bash ```bash
sudo raspi-config --expand-rootfs sudo raspi-config --expand-rootfs
sudo sed -i s/#dtparam=spi=on/dtparam=spi=on/ /boot/config.txt sudo sed -i s/#dtparam=spi=on/dtparam=spi=on/ /boot/config.txt
@ -82,6 +82,9 @@ source venv/bin/activate
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install wheel pip install wheel
pip install -e ./ pip install -e ./
# If you are running on the Raspberry Pi, please install the following too to allow rendering on the display
pip install RPi.GPIO==0.7.1 spidev==3.5
``` ```
## Running Inkycal ## Running Inkycal

View File

@ -151,7 +151,7 @@ def write(image, xy, box_size, text, font=None, **kwargs):
box_width, box_height = box_size box_width, box_height = box_size
# Increase fontsize to fit specified height and width of text box # Increase fontsize to fit specified height and width of text box
if (autofit == True) or (fill_width != 1.0) or (fill_height != 0.8): if autofit or (fill_width != 1.0) or (fill_height != 0.8):
size = 8 size = 8
font = ImageFont.truetype(font.path, size) font = ImageFont.truetype(font.path, size)
text_width, text_height = font.getsize(text)[0], font.getsize('hg')[1] text_width, text_height = font.getsize(text)[0], font.getsize('hg')[1]
@ -169,7 +169,7 @@ def write(image, xy, box_size, text, font=None, **kwargs):
while (text_width, text_height) > (box_width, box_height): while (text_width, text_height) > (box_width, box_height):
text = text[0:-1] text = text[0:-1]
text_width, text_height = font.getsize(text)[0], font.getsize('hg')[1] text_width, text_height = font.getsize(text)[0], font.getsize('hg')[1]
logs.debug((text)) logs.debug(text)
# Align text to desired position # Align text to desired position
if alignment == "center" or None: if alignment == "center" or None:
@ -192,7 +192,7 @@ def write(image, xy, box_size, text, font=None, **kwargs):
# space = Image.new('RGBA', (box_width, box_height), color= 'red') # space = Image.new('RGBA', (box_width, box_height), color= 'red')
# ImageDraw.Draw(space).text((x, y), text, fill='white', font=font) # ImageDraw.Draw(space).text((x, y), text, fill='white', font=font)
if rotation != None: if rotation:
space.rotate(rotation, expand=True) space.rotate(rotation, expand=True)
# Update only region with text (add text with transparent background) # Update only region with text (add text with transparent background)

View File

@ -34,53 +34,65 @@ import sys
from ctypes import * from ctypes import *
EPD_SCK_PIN =11 EPD_SCK_PIN = 11
EPD_MOSI_PIN =10 EPD_MOSI_PIN = 10
EPD_M1_CS_PIN =8 EPD_M1_CS_PIN = 8
EPD_S1_CS_PIN =7 EPD_S1_CS_PIN = 7
EPD_M2_CS_PIN =17 EPD_M2_CS_PIN = 17
EPD_S2_CS_PIN =18 EPD_S2_CS_PIN = 18
EPD_M1S1_DC_PIN =13 EPD_M1S1_DC_PIN = 13
EPD_M2S2_DC_PIN =22 EPD_M2S2_DC_PIN = 22
EPD_M1S1_RST_PIN =6 EPD_M1S1_RST_PIN = 6
EPD_M2S2_RST_PIN =23 EPD_M2S2_RST_PIN = 23
EPD_M1_BUSY_PIN =5 EPD_M1_BUSY_PIN = 5
EPD_S1_BUSY_PIN =19 EPD_S1_BUSY_PIN = 19
EPD_M2_BUSY_PIN =27 EPD_M2_BUSY_PIN = 27
EPD_S2_BUSY_PIN =24 EPD_S2_BUSY_PIN = 24
additional_driver_path = f"{os.path.dirname(os.path.realpath(__file__))}/epd_12_in_48_lib.so" find_dirs = [
os.path.dirname(os.path.realpath(__file__)),
'/usr/local/lib',
'/usr/lib',
]
spi = None
for find_dir in find_dirs:
so_filename = os.path.join(find_dir, 'epd_12_in_48_lib.so')
if os.path.exists(so_filename):
spi = CDLL(so_filename)
break
if spi is None:
RuntimeError('Cannot find epd_12_in_48_lib.so')
if not os.path.exists(additional_driver_path):
RuntimeError("Inkycal cannot find the additional driver files for 12in48 3-colour")
spi = CDLL(additional_driver_path)
def digital_write(pin, value): def digital_write(pin, value):
GPIO.output(pin, value) GPIO.output(pin, value)
def digital_read(pin): def digital_read(pin):
return GPIO.input(pin) return GPIO.input(pin)
def spi_writebyte(value):
def spi_writebyte(value):
spi.DEV_SPI_WriteByte(value) spi.DEV_SPI_WriteByte(value)
def delay_ms(delaytime): def delay_ms(delaytime):
time.sleep(delaytime / 1000.0) time.sleep(delaytime / 1000.0)
def module_init(): def module_init():
GPIO.setmode(GPIO.BCM) GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False) GPIO.setwarnings(False)
GPIO.setup(EPD_SCK_PIN, GPIO.OUT) GPIO.setup(EPD_SCK_PIN, GPIO.OUT)
GPIO.setup(EPD_MOSI_PIN, GPIO.OUT) GPIO.setup(EPD_MOSI_PIN, GPIO.OUT)
logging.debug("python call wiringPi Lib") logging.debug("python call wiringPi Lib")
GPIO.setup(EPD_M2S2_RST_PIN, GPIO.OUT) GPIO.setup(EPD_M2S2_RST_PIN, GPIO.OUT)
GPIO.setup(EPD_M1S1_RST_PIN, GPIO.OUT) GPIO.setup(EPD_M1S1_RST_PIN, GPIO.OUT)
GPIO.setup(EPD_M2S2_DC_PIN, GPIO.OUT) GPIO.setup(EPD_M2S2_DC_PIN, GPIO.OUT)
GPIO.setup(EPD_M1S1_DC_PIN, GPIO.OUT) GPIO.setup(EPD_M1S1_DC_PIN, GPIO.OUT)
@ -93,12 +105,12 @@ def module_init():
GPIO.setup(EPD_S2_BUSY_PIN, GPIO.IN) GPIO.setup(EPD_S2_BUSY_PIN, GPIO.IN)
GPIO.setup(EPD_M1_BUSY_PIN, GPIO.IN) GPIO.setup(EPD_M1_BUSY_PIN, GPIO.IN)
GPIO.setup(EPD_M2_BUSY_PIN, GPIO.IN) GPIO.setup(EPD_M2_BUSY_PIN, GPIO.IN)
digital_write(EPD_M1_CS_PIN, 1) digital_write(EPD_M1_CS_PIN, 1)
digital_write(EPD_S1_CS_PIN, 1) digital_write(EPD_S1_CS_PIN, 1)
digital_write(EPD_M2_CS_PIN, 1) digital_write(EPD_M2_CS_PIN, 1)
digital_write(EPD_S2_CS_PIN, 1) digital_write(EPD_S2_CS_PIN, 1)
digital_write(EPD_M2S2_RST_PIN, 0) digital_write(EPD_M2S2_RST_PIN, 0)
digital_write(EPD_M1S1_RST_PIN, 0) digital_write(EPD_M1S1_RST_PIN, 0)
digital_write(EPD_M2S2_DC_PIN, 1) digital_write(EPD_M2S2_DC_PIN, 1)
@ -106,6 +118,7 @@ def module_init():
spi.DEV_ModuleInit() spi.DEV_ModuleInit()
def module_exit(): def module_exit():
digital_write(EPD_M2S2_RST_PIN, 0) digital_write(EPD_M2S2_RST_PIN, 0)
digital_write(EPD_M1S1_RST_PIN, 0) digital_write(EPD_M1S1_RST_PIN, 0)
@ -116,25 +129,25 @@ def module_exit():
digital_write(EPD_M1_CS_PIN, 1) digital_write(EPD_M1_CS_PIN, 1)
digital_write(EPD_M2_CS_PIN, 1) digital_write(EPD_M2_CS_PIN, 1)
def spi_readbyte(Reg): def spi_readbyte(Reg):
GPIO.setup(EPD_MOSI_PIN, GPIO.IN) GPIO.setup(EPD_MOSI_PIN, GPIO.IN)
j=0 j = 0
# time.sleep(0.01) # time.sleep(0.01)
for i in range(0, 8): for i in range(0, 8):
GPIO.output(EPD_SCK_PIN, GPIO.LOW) GPIO.output(EPD_SCK_PIN, GPIO.LOW)
# time.sleep(0.01) # time.sleep(0.01)
j = j << 1 j = j << 1
if(GPIO.input(EPD_MOSI_PIN) == GPIO.HIGH): if (GPIO.input(EPD_MOSI_PIN) == GPIO.HIGH):
j |= 0x01 j |= 0x01
else: else:
j &= 0xfe j &= 0xfe
# time.sleep(0.01) # time.sleep(0.01)
GPIO.output(EPD_SCK_PIN, GPIO.HIGH) GPIO.output(EPD_SCK_PIN, GPIO.HIGH)
# time.sleep(0.01) # time.sleep(0.01)
GPIO.setup(EPD_MOSI_PIN, GPIO.OUT) GPIO.setup(EPD_MOSI_PIN, GPIO.OUT)
return j return j
def delay_ms(delaytime): def delay_ms(delaytime):
time.sleep(delaytime / 1000.0) time.sleep(delaytime / 1000.0)

View File

@ -9,33 +9,17 @@ Copyright by aceisace
import glob import glob
import hashlib import hashlib
import json import json
import os
import traceback import traceback
from logging.handlers import RotatingFileHandler from logging.handlers import RotatingFileHandler
import arrow import arrow
import numpy
from inkycal.custom import * from inkycal.custom import *
from inkycal.display import Display from inkycal.display import Display
from inkycal.modules.inky_image import Inkyimage as Images from inkycal.modules.inky_image import Inkyimage as Images
try: from PIL import Image
from PIL import Image
except ImportError:
print('Pillow is not installed! Please install with:')
print('pip3 install Pillow')
try:
import numpy
except ImportError:
print('numpy is not installed!. \nIf you are on Windows '
'run: pip3 install numpy \nIf you are on Raspberry Pi '
'remove numpy: pip3 uninstall numpy \nThen try again.')
# (i): Logging shows logs above a threshold level.
# e.g. logging.DEBUG will show all from DEBUG until CRITICAL
# e.g. logging.ERROR will show from ERROR until CRITICAL
# #DEBUG > #INFO > #ERROR > #WARNING > #CRITICAL
# On the console, set a logger to show only important logs # On the console, set a logger to show only important logs
# (level ERROR or higher) # (level ERROR or higher)
@ -51,6 +35,10 @@ if on_rtd:
handlers=[stream_handler]) handlers=[stream_handler])
else: else:
if not os.path.exists(f'{top_level}/logs'):
os.mkdir(f'{top_level}/logs')
# Save all logs to a file, which contains more detailed output # Save all logs to a file, which contains more detailed output
logging.basicConfig( logging.basicConfig(
level=logging.INFO, level=logging.INFO,

View File

@ -112,10 +112,9 @@ class Feeds(inkycal_module):
parsed_feeds.append(f"{posts.title}: {re.sub('<[^<]+?>', '', posts.summary)}") parsed_feeds.append(f"{posts.title}: {re.sub('<[^<]+?>', '', posts.summary)}")
# if "description" in posts: # if "description" in posts:
parsed_feeds = [i.split("\n") for i in parsed_feeds][0] if parsed_feeds:
parsed_feeds = [i for i in parsed_feeds if i] parsed_feeds = [i.split("\n") for i in parsed_feeds][0]
parsed_feeds = [i for i in parsed_feeds if i]
self._parsed_feeds = parsed_feeds
# Shuffle the list to prevent showing the same content # Shuffle the list to prevent showing the same content
if self.shuffle_feeds: if self.shuffle_feeds:
@ -134,7 +133,6 @@ class Feeds(inkycal_module):
if counter < max_lines: if counter < max_lines:
filtered_feeds.append(wrapped) filtered_feeds.append(wrapped)
filtered_feeds = flatten(filtered_feeds) filtered_feeds = flatten(filtered_feeds)
self._filtered_feeds = filtered_feeds
logger.debug(f'filtered feeds -> {filtered_feeds}') logger.debug(f'filtered feeds -> {filtered_feeds}')

View File

@ -16,7 +16,7 @@ logger = logging.getLogger(__name__)
class Todoist(inkycal_module): class Todoist(inkycal_module):
"""Todoist api class """Todoist api class
parses todo's from api-key parses todos from the todoist api.
""" """
name = "Todoist API - show your todos from todoist" name = "Todoist API - show your todos from todoist"

View File

@ -1,31 +1,30 @@
arrow==1.2.2 arrow==1.2.3
certifi==2021.10.8 certifi==2022.12.7
charset-normalizer==2.0.12
cycler==0.11.0 cycler==0.11.0
feedparser==6.0.8 feedparser==6.0.10
fonttools==4.32.0 fonttools==4.38.0
geojson==2.5.0 geojson==2.5.0
icalendar==4.0.9 icalendar==5.0.4
kiwisolver==1.4.2 kiwisolver==1.4.4
lxml==4.8.0 lxml==4.9.2
matplotlib==3.5.1 matplotlib==3.6.2
multitasking==0.0.10 multitasking==0.0.11
numpy==1.22.3 numpy==1.24.1
packaging==21.3 packaging==23.0
pandas==1.3.5 pandas==1.5.2
Pillow==9.2.0 Pillow==9.4.0
pyowm==3.3.0 pyowm==3.3.0
pyparsing==3.0.7 pyparsing==3.0.9
PySocks==1.7.1 PySocks==1.7.1
python-dateutil==2.8.2 python-dateutil==2.8.2
pytz==2022.1 pytz==2022.7
recurring-ical-events==0.1.17b0 recurring-ical-events==0.1.17b0
requests==2.27.1 requests==2.28.1
RPi.GPIO==0.7.1 #RPi.GPIO==0.7.1
sgmllib3k==1.0.0 sgmllib3k==1.0.0
six==1.16.0 six==1.16.0
spidev==3.5 # spidev==3.5
todoist-api-python==2.0.0 todoist-api-python==2.0.2
typing_extensions==4.1.1 typing_extensions==4.4.0
urllib3==1.26.9 urllib3==1.26.13
yfinance==0.1.70 yfinance==0.2.3