bump requirements
fix some minor issues code cleanup
This commit is contained in:
parent
86fa5d51da
commit
24ae6df27e
15
README.md
15
README.md
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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}')
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user