bump requirements
fix some minor issues code cleanup
This commit is contained in:
		
							
								
								
									
										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,44 +34,56 @@ 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) | ||||||
| @@ -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,15 +129,16 @@ 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 | ||||||
| @@ -134,7 +148,6 @@ def spi_readbyte(Reg): | |||||||
|     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,11 +112,10 @@ 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: | ||||||
|  |  | ||||||
|  |         if parsed_feeds: | ||||||
|             parsed_feeds = [i.split("\n") for i in parsed_feeds][0] |             parsed_feeds = [i.split("\n") for i in parsed_feeds][0] | ||||||
|             parsed_feeds = [i for i in parsed_feeds if i] |             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: | ||||||
|             shuffle(parsed_feeds) |             shuffle(parsed_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 | ||||||
		Reference in New Issue
	
	Block a user