E-Paper display loop with plugins

Overview

PaperPi V3

Spellcheck

NOTE

This version of PaperPi is under heavy development and is not ready for the average user. We are working on adding more screen compatibility, possibly adding color screen support for inkyPHAT and WaveShare 3 color screens. There are also plans to make plugins easier to install and update.

See our Milestones here. PRs, bug reports, contributions, and testers are welcome.

This version is compatible with Raspberry Pi OS Bullseye and does not work properly with Buster.

The stable version of PaperPi can be found here.

Splash Screen Splash Screen PaperPi PaperPi Weather Plugin

About PaperPi

PaperPi is an e-Paper display with multiple rotating display plugins that contain dynamic content.

PaperPi is a quiet and clean portal to the internet. No loud colors, no busy animations, just a lovely selection of the information you want without buzz and distraction. PaperPi rotates through your choice of plugin screens at the pace you choose.

PaperPi is written to work with almost all of the WaveShare SPI displays out of the box. PaperPi will work with the tiny 2" displays all the way up to the 10" HD displays with minimal configuration. Check the complete list of supported screens below.

For information on building a frame, case and custom cable, see these instructions.

To get started, jump to the Setup Instructions

Plugins

PaperPi supports many different plugins and layouts for each plugin.

Complete Plugins List

librespot pluginLibreSpot (spotify) Plugin word clock pluginWord Clock lms client pluginLogitech Media Server Plugin
decimal binary clockMoon Phase met_no pluginMet.no Weather Crypto Currency TickerCrypto Currency
reddit/r/quotesReddit Quotes XKCD ComicXKCD Comic Basic ClockBasic Clock

See the Developing Plugins guide for more information on creating your own plugins.

Changes

See the Change Log for a complete list of updates

V 0.3.0

  • PaperPi is no longer distributed as a PyInstaller frozen blob and now installs into /usr/local/paperpi and places an executable entry script in /usr/local/bin/.
  • Plugins can now be edited easily in /usr/local/paperpi/plugins/
  • Additional plugins can be placed in /usr/local/paperpi/plugins without rebuilding
  • Add support for mirroring output

PaperPi Requirements

PaperPi is compatible with Raspberry Pi OS Bullseye. Some python dependencies such as numpy will not build properly under Buster.

Required Hardware

  • Raspberry Pi (Pi 4, Pi 3, and Pi Zero)
  • Raspberry Pi OS Buster or later (64-bit supported)
  • WaveShare EPD Screen with PiHat
    • see the full list of currently supported screens
    • Note: HDMI screens are not supported

Optional Hardware

  • HiFiBerry hat (optional)
    • The HiFiBerry DAC+ PRO and similar boards add high-quality audio output to the Pi so it can act as a display and also work as a LMS client player using squeezelite
    • GPIO 2x20 headers must be added to the HiFiBerry HAT to provide an interface for the WaveShare HAT.
    • HiFiBerry's DAC+ Bundle with the following configuration is a good choice:
      • DAC+ Pro
      • Acrylic Case for (RCA) AND DIGI+
      • Raspberry Pi 4B 2GB (1GB should be sufficient as well)
      • 16GB SD Card
      • PowerSupply (USB C 5.1V/3A)
      • 2x20 Pin Male Header (required for WaveShare HAT)

Optional Software

PaperPi plugins work with a variety of other software such as Logitech Media Server and Spotify. Check the Plugin documentation for further instructions

Install & Setup

PaperPi requires only small amount of setup and is packaged with amateurs in mind. By default PaperPi will install as a daemon service that will start at boot.

Install

To get started, copy and paste the following command into a terminal window to download the latest stable version of PaperPi and automatically start the install and setup process.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/txoof/PaperPi/main/install/remote_install.sh)"

If you would rather install PaperPi yourself, clone this repo and run ./install/install.sh

Setup

Daemon Mode

The installer should prompt you to edit /etc/defaults/paperpi.ini. At minimum you must add your EPD Screen and enable several plugins. A complete list of supported EPD Screens are listed below.

Any changes to the PaperPi configuration require a restart of the service:

sudo systemctl restart paperpi-daemon.service

To disable the service from starting on boot, run the command:

sudo systemctl disable paperpi-daemon.service

On Demand

If you would rather run PaperPi on-demand rather than a daemon service you can run it as regular user (e.g. pi) by running /usr/local/bin/paperpi. A new configuration file will be created in your user's directory. Make sure to edit this file and add, at minimum, your EPD Screen.

PaperPi can be run on demand in daemon mode using paperpi -d

Uninstall

To uninstall PaperPi, run ./install/install.sh with either -u to uninstall or -p to uninstall and remove all configuration files.

Command Reference

usage: paperpi.py [-h] [--add_config plugin user|daemon] [-c CONFIG_FILE.ini]
                  [-l LOG_LEVEL] [-d] [--list_plugins]
                  [--plugin_info [plugin|plugin.function]]
                  [--run_plugin_func plugin.function [optional_arg1 arg2 argN ...]]
                  [-V]

optional arguments:
  -h, --help            show this help message and exit
  --add_config plugin user|daemon
                        copy sample config to the user or daemon configuration
                        file
  -c CONFIG_FILE.ini, --config CONFIG_FILE.ini
                        use the specified configuration file
  -l LOG_LEVEL, --log_level LOG_LEVEL
                        change the log output level
  -d, --daemon          run in daemon mode (ignore user configuration if
                        found)
  --list_plugins        list all available plugins
  --plugin_info [plugin|plugin.function]
                        get information for plugins and user-facing functions
                        provided by a plugin
  --run_plugin_func plugin.function [optional_arg1 arg2 argN ...]
                        run a user-facing function for a plugin
  -V, --version         display version and exit

--add_config plugin user|daemon: add a configuration file for plugin to the user configuration or daemon configuration files

-c/--config CONFIG_FILE.ini: Use the specified CONFIG_FILE instead of the default

-l/--log_level DEBUG|INFO|WARNING|ERROR: Specify the logging level from the command line

--list_plugins: List all plugins that have been found.

--plugin_info plugin|plugin.function: Print help information for a plugin and all of it's helper functions or a specific plugin.function

--run_plugin_func plugin.function Some plugins provide helper functions such as determining the LAT/LON of a location (met_no, moon_phases) or finding local Logitech Media Servers (lms_client). --run_plugin_func runs a plugin helper function. Use --plugin_info to learn more.

-V/--version: Display version information and exit

Developing PaperPi

If you would like to develop plugins for PaperPi, you will likely need a working build environment.

Requirements

  • python 3.7+
  • pipenv

Create a Build Environment

  1. Clone the repo: https://github.com/txoof/PaperPi
  2. Run $ ./utilities/create_devel_environment.sh to create a build environment
    • This will check for all necessary libraries and python modules and create a local venv for development

Contributing

Plugins can be pure python, but should follow the guide provided.

Supported Screens

Most NON-IT8951 screens are only supported in 1 bit (black and white) mode. Color output is not supported at this time. Some waveshare drivers do not provide 'standard' display and Clear methods; these displays are not supported at this time.

All IT8951 Screens now support 8 bit grayscale output.

Some WaveShare screens that support color output will also work with with the non-colored driver. Using the 1 bit driver can yield significantly better update speeds. For example: the waveshare_epd.epd2in7b screen takes around 15 seconds to update even when refreshing a 1 bit image, but can be run using the waveshare_epd.epd2in7 module in 1-bit mode which takes less than 2 seconds to update.

WaveShare Screen

NN. mfg.name

  1. inky.auto
  2. inky.impression
  3. inky.phat1608_black
  4. inky.phat1608_red
  5. inky.phat1608_yellow
  6. inky.phat_black
  7. inky.phat_red
  8. inky.phat_yellow
  9. inky.what_black
  10. inky.what_red
  11. inky.what_yellow
  12. omni_epd.mock
  13. waveshare_epd.epd1in02
  14. waveshare_epd.epd1in54
  15. waveshare_epd.epd1in54_V2
  16. waveshare_epd.epd1in54b
  17. waveshare_epd.epd1in54b_V2
  18. waveshare_epd.epd1in54c
  19. waveshare_epd.epd2in13
  20. waveshare_epd.epd2in13_V2
  21. waveshare_epd.epd2in13b
  22. waveshare_epd.epd2in13b_V3
  23. waveshare_epd.epd2in13c
  24. waveshare_epd.epd2in13d
  25. waveshare_epd.epd2in66
  26. waveshare_epd.epd2in66b
  27. waveshare_epd.epd2in7
  28. waveshare_epd.epd2in7b
  29. waveshare_epd.epd2in7b_V2
  30. waveshare_epd.epd2in9
  31. waveshare_epd.epd2in9_V2
  32. waveshare_epd.epd2in9b
  33. waveshare_epd.epd2in9b_V3
  34. waveshare_epd.epd2in9c
  35. waveshare_epd.epd2in9d
  36. waveshare_epd.epd3in7
  37. waveshare_epd.epd4in01f
  38. waveshare_epd.epd4in2
  39. waveshare_epd.epd4in2b
  40. waveshare_epd.epd4in2b_V2
  41. waveshare_epd.epd4in2c
  42. waveshare_epd.epd5in65f
  43. waveshare_epd.epd5in83
  44. waveshare_epd.epd5in83_V2
  45. waveshare_epd.epd5in83b
  46. waveshare_epd.epd5in83b_V2
  47. waveshare_epd.epd5in83c
  48. waveshare_epd.epd7in5
  49. waveshare_epd.epd7in5_HD
  50. waveshare_epd.epd7in5_V2
  51. waveshare_epd.epd7in5b
  52. waveshare_epd.epd7in5b_HD
  53. waveshare_epd.epd7in5b_V2
  54. waveshare_epd.epd7in5c
  55. waveshare_epd.it8951

Issues

Hardware Issues See the troubleshooting guide

Software Bugs Please open tickets at GitHub.

Document updated 2022.05.01

PaperPi (Development)

This is a development version of PaperPi that's not fit for prime-time yet.

The official version can be found here.

Helping Out

If you're interested in helping out, check out the issues and jump in. Collaborators are always welcome

Comments
  • 64-bit install failing

    64-bit install failing

    Same as the issue #48. 32-bit (Bullseye) works fine, but in the 64-bit version, something in the PyCairo dependency is causing the script to fail.

    I think the quick and dirty fix would be to check if the OS is 64-bit and the PyCairo dependency is listed in the Pipfile. If it is, just do a quick sudo apt install pycairo2-dev

    Alternatively, we could try to track down what is failing or why and see if their is a cleaner fix. There seems to be hint at PATH variables and obsolete installation methods, but a quick search doesn't turn up much.

    pipenv install pycairo ouput:

    Installing initially failed dependencies...
    [pipenv.exceptions.InstallError]: Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
    [pipenv.exceptions.InstallError]: Collecting pycairo
    [pipenv.exceptions.InstallError]:   Using cached pycairo-1.20.1.tar.gz (344 kB)
    [pipenv.exceptions.InstallError]:   Preparing metadata (setup.py): started
    [pipenv.exceptions.InstallError]:   Preparing metadata (setup.py): finished with status 'done'
    [pipenv.exceptions.InstallError]: Building wheels for collected packages: pycairo
    [pipenv.exceptions.InstallError]:   Building wheel for pycairo (setup.py): started
    [pipenv.exceptions.InstallError]:   Building wheel for pycairo (setup.py): finished with status 'error'
    [pipenv.exceptions.InstallError]:   Running setup.py clean for pycairo
    [pipenv.exceptions.InstallError]: Failed to build pycairo
    [pipenv.exceptions.InstallError]: Installing collected packages: pycairo
    [pipenv.exceptions.InstallError]:   Running setup.py install for pycairo: started
    [pipenv.exceptions.InstallError]:   Running setup.py install for pycairo: finished with status 'error'
    [pipenv.exceptions.InstallError]: error: subprocess-exited-with-error
    [pipenv.exceptions.InstallError]:
    [pipenv.exceptions.InstallError]:   × python setup.py bdist_wheel did not run successfully.
    [pipenv.exceptions.InstallError]:   │ exit code: 1
    [pipenv.exceptions.InstallError]:   ╰─> [11 lines of output]
    [pipenv.exceptions.InstallError]:       running bdist_wheel
    [pipenv.exceptions.InstallError]:       running build
    [pipenv.exceptions.InstallError]:       running build_py
    [pipenv.exceptions.InstallError]:       warning: build_py: byte-compiling is disabled, skipping.
    [pipenv.exceptions.InstallError]:
    [pipenv.exceptions.InstallError]:       running build_ext
    [pipenv.exceptions.InstallError]:       Package cairo was not found in the pkg-config search path.
    [pipenv.exceptions.InstallError]:       Perhaps you should add the directory containing `cairo.pc'
    [pipenv.exceptions.InstallError]:       to the PKG_CONFIG_PATH environment variable
    [pipenv.exceptions.InstallError]:       No package 'cairo' found
    [pipenv.exceptions.InstallError]:       Command '['pkg-config', '--print-errors', '--exists', 'cairo >= 1.15.10']' returned non-zero exit status 1.
    [pipenv.exceptions.InstallError]:       [end of output]
    [pipenv.exceptions.InstallError]:
    [pipenv.exceptions.InstallError]:   note: This error originates from a subprocess, and is likely not a problem with pip.
    [pipenv.exceptions.InstallError]:   ERROR: Failed building wheel for pycairo
    [pipenv.exceptions.InstallError]:   error: subprocess-exited-with-error
    [pipenv.exceptions.InstallError]:
    [pipenv.exceptions.InstallError]:   × Running setup.py install for pycairo did not run successfully.
    [pipenv.exceptions.InstallError]:   │ exit code: 1
    [pipenv.exceptions.InstallError]:   ╰─> [13 lines of output]
    [pipenv.exceptions.InstallError]:       running install
    [pipenv.exceptions.InstallError]:       /usr/local/paperpi/.venv/lib/python3.9/site-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
    [pipenv.exceptions.InstallError]:         warnings.warn(
    [pipenv.exceptions.InstallError]:       running build
    [pipenv.exceptions.InstallError]:       running build_py
    [pipenv.exceptions.InstallError]:       warning: build_py: byte-compiling is disabled, skipping.
    [pipenv.exceptions.InstallError]:
    [pipenv.exceptions.InstallError]:       running build_ext
    [pipenv.exceptions.InstallError]:       Package cairo was not found in the pkg-config search path.
    [pipenv.exceptions.InstallError]:       Perhaps you should add the directory containing `cairo.pc'
    [pipenv.exceptions.InstallError]:       to the PKG_CONFIG_PATH environment variable
    [pipenv.exceptions.InstallError]:       No package 'cairo' found
    [pipenv.exceptions.InstallError]:       Command '['pkg-config', '--print-errors', '--exists', 'cairo >= 1.15.10']' returned non-zero exit status 1.
    [pipenv.exceptions.InstallError]:       [end of output]
    [pipenv.exceptions.InstallError]:
    [pipenv.exceptions.InstallError]:   note: This error originates from a subprocess, and is likely not a problem with pip.
    [pipenv.exceptions.InstallError]: error: legacy-install-failure
    [pipenv.exceptions.InstallError]:
    [pipenv.exceptions.InstallError]: × Encountered error while trying to install package.
    [pipenv.exceptions.InstallError]: ╰─> pycairo
    [pipenv.exceptions.InstallError]:
    [pipenv.exceptions.InstallError]: note: This is an issue with the package mentioned above, not pip.
    [pipenv.exceptions.InstallError]: hint: See above for output from the failure.
    ERROR: Couldn't install package: pycairo
     Package installation failed...
      ☤  ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/1 — 0
    
    opened by aaronr8684 13
  • Can slideshow pull images from pendrive?

    Can slideshow pull images from pendrive?

    Hello,

    It seems that when specifying a mounted drive as a directory for the slideshow plugin permission is denied. When specifying the default directory it works fine. This is my first raspberry pi project and I'm not sure how to proceed from here, is it possible to enable permissions for the slideshow plugin to access images from mounted drives?

    Dec 10 18:37:18 raspberrypi systemd[1]: Started PaperPi E-Paper Display.
    Dec 10 18:37:25 raspberrypi paperpi[1770]: 18:37:25 paperpi :get_config_files:251 :INFO       - using configuration files to configure PaperPi: [PosixPath('/usr/local/paperpi/config/paperpi.ini'), PosixPath('/etc/default/paperpi.ini')]
    Dec 10 18:37:43 raspberrypi paperpi[1770]: Traceback (most recent call last):
    Dec 10 18:37:43 raspberrypi paperpi[1770]:   File "/usr/local/paperpi/paperpi.py", line 759, in <module>
    Dec 10 18:37:43 raspberrypi paperpi[1770]:     exit_code = main()
    Dec 10 18:37:43 raspberrypi paperpi[1770]:   File "/usr/local/paperpi/paperpi.py", line 732, in main
    Dec 10 18:37:43 raspberrypi paperpi[1770]:     plugins = build_plugins_list(config=config, resolution=screen.resolution,
    Dec 10 18:37:43 raspberrypi paperpi[1770]:   File "/usr/local/paperpi/paperpi.py", line 431, in build_plugins_list
    Dec 10 18:37:43 raspberrypi paperpi[1770]:     my_plugin.update()
    Dec 10 18:37:43 raspberrypi paperpi[1770]:   File "/usr/local/paperpi/library/Plugin.py", line 165, in update
    Dec 10 18:37:43 raspberrypi paperpi[1770]:     is_updated, data, priority = self.update_function(*args, **kwargs)
    Dec 10 18:37:43 raspberrypi paperpi[1770]:   File "/usr/local/paperpi/plugins/slideshow/slideshow.py", line 265, in update_function
    Dec 10 18:37:43 raspberrypi paperpi[1770]:     image_array = _index_images(image_path)
    Dec 10 18:37:43 raspberrypi paperpi[1770]:   File "/usr/local/paperpi/plugins/slideshow/slideshow.py", line 44, in _index_images
    Dec 10 18:37:43 raspberrypi paperpi[1770]:     if image_path.is_dir():
    Dec 10 18:37:43 raspberrypi paperpi[1770]:   File "/usr/lib/python3.9/pathlib.py", line 1422, in is_dir
    Dec 10 18:37:43 raspberrypi paperpi[1770]:     return S_ISDIR(self.stat().st_mode)
    Dec 10 18:37:43 raspberrypi paperpi[1770]:   File "/usr/lib/python3.9/pathlib.py", line 1221, in stat
    Dec 10 18:37:43 raspberrypi paperpi[1770]:     return self._accessor.stat(self)
    Dec 10 18:37:43 raspberrypi paperpi[1770]: PermissionError: [Errno 13] Permission denied: '/media/pi/Pendrive'
    Dec 10 18:37:44 raspberrypi systemd[1]: paperpi-daemon.service: Main process exited, code=exited, status=1/FAILURE
    Dec 10 18:37:44 raspberrypi systemd[1]: paperpi-daemon.service: Failed with result 'exit-code'.
    Dec 10 18:37:44 raspberrypi systemd[1]: paperpi-daemon.service: Consumed 20.450s CPU time
    
    opened by PaperCloud10 9
  • Screen Mirrored issue

    Screen Mirrored issue

    mirror=True does not reverse mirror for me. I am using 10.3inch EPD and IT8951. here is my config file

    #CONFIG_VERSION=1 [main] #waveshare display type use HD for IT8951 displays display_type = HD #required vcom value for IT8951 screens vcom = -1.50 #maximum refresh between total screen clear for HD displays max_refresh = 4 #logging output level log_level = WARNING #display splash screen (True or False) splash = True #rotation of EPD display #(cable bottom: 0; cable left: -90; cable right: 90; cable top: 180) rotation = 0 #mirror screen output - useful if output to screen appears backwards' mirror=True

    Have also tried: mirror = True

    I'm probably missing something obvious. Any suggestions?

    bug 
    opened by mTyguy 8
  • epd2in9d text is way too tiny

    epd2in9d text is way too tiny

    Understanding this is a small screen, I can not figure out how to get the font size up to a readable size on even the most basic plugin layouts.

    For example, in just trying to use the two_rows_text_only layout of the librespot_client plugin, the song title is perfectly readable, but the artist name is in a tiny unreadable size, all the way at the bottom. The artist name is more legible in the default layout with album art than it is here, but I can not figure out how to properly get the fonts to render.

    Understanding this might just be my novice ignorance, any ideas or maybe a nudge in the right direction?

    opened by mattyteaks 4
  • Quality of life improvements in install scripts

    Quality of life improvements in install scripts

    I'd like to make a few more quality of life improvements for the end user like adding a way to see a list of compatible screens and maybe adding at least one plugin to the base ini file (even if it's disabled by default). Originally posted by @aaronr8684 in https://github.com/txoof/PaperPi/issues/7#issuecomment-1040565871

    • [x] add more default plutins
    • [ ] provide list of compatible screens during install process
    opened by txoof 4
  • Squash 220226

    Squash 220226

    I've squashed most of the commits and reworded a bit.

    I'm kind of new to the idea of rebasing/squashing and could use another pair of eyes to see if anything looks out of whack.

    This should resolve all of #28: Squashing commits and updating remote installer.

    opened by txoof 3
  • Add the option for daemon (default) or user run

    Add the option for daemon (default) or user run

    I think it would be a nice to allow the user to choose if they don't want to install this as a service automatically, but give them the necessary commands to install it later if they change their mind.

    opened by aaronr8684 3
  • Install fails on installing epdlib in venv

    Install fails on installing epdlib in venv

          no previously-included directories found matching '.ci'
          adding license file 'LICENSE'
          writing manifest file 'src/Pillow.egg-info/SOURCES.txt'
          warning: build_py: byte-compiling is disabled, skipping.
    
          running build_ext
    
    
          The headers or library files could not be found for jpeg,
          a required dependency when compiling Pillow from source.
    
          Please see the install instructions at:
             https://pillow.readthedocs.io/en/latest/installation.html
    
    
    opened by txoof 2
  • Scripted install from cloned repo

    Scripted install from cloned repo

    Install script in repo creates pipenv and installs paperpi locally for:

    • Buster (32 bit)
    • Bullseye (32 bit)
    • Bullseye (64 bit)

    Installer should:

    • [x] Create pipenv venv
    • [x] Install necessary Debian dependencies
    • [x] Install correct python packages for arch
      • [x] (handle differences between 32 and 64 bit versions of Bullseye)
    • [x] Create executable
    • [x] Enable SPI automatically
    • [x] Prompt user to edit paperpi.ini and open it automatically
    • [x] Install systemd unit files and associated daemon user/group
    • [x] Start service automatically if user has already edited the ini and all dependencies have been met
    opened by txoof 2
  • if all images are removed, slidshow gets stuck on last displayed image

    if all images are removed, slidshow gets stuck on last displayed image

    If all the image files are removed from the slideshow directory, it gets stuck displaying the last image in memory indefinitely.

    It might make sense to fallback to the default images, or possibly stop displaying altogether.

    opened by txoof 1
  • Development environment build does not enable spi

    Development environment build does not enable spi

    When creating a development environment, SPI is not enabled. This is OK, but it should probably prompt the user to do something about it.

    Something along these lines would be helpful:

    ...
    Development environment configured
    You should now check if SPI is enabled with (1 means disabled, 0 means enabled):
       $ sudo raspi-config nonint get_spi
    Enable SPI with:
       $ sudo raspi-config nonint do_spi 0
    
    opened by txoof 1
  • find_imports.sh kicks errors when processing slideshow

    find_imports.sh kicks errors when processing slideshow

    INFO: Successfully saved requirements file in ../paperpi/plugins//slideshow/requirements-slideshow.txt
    Traceback (most recent call last):
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/bin/pipreqs", line 8, in <module>
        sys.exit(main())
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 488, in main
        init(args)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 478, in init
        generate_requirements_file(path, imports, symbol)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 157, in generate_requirements_file
        with _open(path, "w") as out_file:
      File "/usr/lib/python3.9/contextlib.py", line 117, in __enter__
        return next(self.gen)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 81, in _open
        file = open(filename, mode)
    NotADirectoryError: [Errno 20] Not a directory: '../paperpi/plugins//slideshow.image_only_centered_blackbkground-sample.png/requirements-slideshow.image_only_centered_blackbkground-sample.png.txt'
    sed: can't read ../paperpi/plugins//slideshow.image_only_centered_blackbkground-sample.png/requirements-slideshow.image_only_centered_blackbkground-sample.png.txt: Not a directory
    Traceback (most recent call last):
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/bin/pipreqs", line 8, in <module>
        sys.exit(main())
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 488, in main
        init(args)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 478, in init
        generate_requirements_file(path, imports, symbol)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 157, in generate_requirements_file
        with _open(path, "w") as out_file:
      File "/usr/lib/python3.9/contextlib.py", line 117, in __enter__
        return next(self.gen)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 81, in _open
        file = open(filename, mode)
    NotADirectoryError: [Errno 20] Not a directory: '../paperpi/plugins//slideshow.image_only_centered_whitebkground-sample.png/requirements-slideshow.image_only_centered_whitebkground-sample.png.txt'
    sed: can't read ../paperpi/plugins//slideshow.image_only_centered_whitebkground-sample.png/requirements-slideshow.image_only_centered_whitebkground-sample.png.txt: Not a directory
    Traceback (most recent call last):
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/bin/pipreqs", line 8, in <module>
        sys.exit(main())
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 488, in main
        init(args)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 478, in init
        generate_requirements_file(path, imports, symbol)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 157, in generate_requirements_file
        with _open(path, "w") as out_file:
      File "/usr/lib/python3.9/contextlib.py", line 117, in __enter__
        return next(self.gen)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 81, in _open
        file = open(filename, mode)
    NotADirectoryError: [Errno 20] Not a directory: '../paperpi/plugins//slideshow.image_time_centered_blackbkground-sample.png/requirements-slideshow.image_time_centered_blackbkground-sample.png.txt'
    sed: can't read ../paperpi/plugins//slideshow.image_time_centered_blackbkground-sample.png/requirements-slideshow.image_time_centered_blackbkground-sample.png.txt: Not a directory
    Traceback (most recent call last):
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/bin/pipreqs", line 8, in <module>
        sys.exit(main())
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 488, in main
        init(args)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 478, in init
        generate_requirements_file(path, imports, symbol)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 157, in generate_requirements_file
        with _open(path, "w") as out_file:
      File "/usr/lib/python3.9/contextlib.py", line 117, in __enter__
        return next(self.gen)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 81, in _open
        file = open(filename, mode)
    NotADirectoryError: [Errno 20] Not a directory: '../paperpi/plugins//slideshow.image_time_centered_whitebkground-sample.png/requirements-slideshow.image_time_centered_whitebkground-sample.png.txt'
    sed: can't read ../paperpi/plugins//slideshow.image_time_centered_whitebkground-sample.png/requirements-slideshow.image_time_centered_whitebkground-sample.png.txt: Not a directory
    Traceback (most recent call last):
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/bin/pipreqs", line 8, in <module>
        sys.exit(main())
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 488, in main
        init(args)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 478, in init
        generate_requirements_file(path, imports, symbol)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 157, in generate_requirements_file
        with _open(path, "w") as out_file:
      File "/usr/lib/python3.9/contextlib.py", line 117, in __enter__
        return next(self.gen)
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/pipreqs/pipreqs.py", line 81, in _open
        file = open(filename, mode)
    NotADirectoryError: [Errno 20] Not a directory: '../paperpi/plugins//slideshow.layout-sample.png/requirements-slideshow.layout-sample.png.txt'
    
    opened by txoof 0
  • Show in log headers if running in daemon or user mode

    Show in log headers if running in daemon or user mode

    The log header should indicate if PaperPi is running in daemon or user mode. It's possible to infer this from the log line, but it would be nice to see which mode is being used:

    $ sudo /usr/local/bin/paperpi -d
    12:52:17 paperpi :get_config_files:251 :INFO       - using configuration files to configure PaperPi: [PosixPath('/usr/local/paperpi/config/paperpi.ini'), **PosixPath('/etc/default/paperpi.ini')]**
    

    could read:

    $ sudo /usr/local/bin/paperpi -d
    12:52:16 paperpi: main:123 :INFO starting in DAEMON mode with option -d
    12:52:17 paperpi :get_config_files:251 :INFO       - using configuration files to configure PaperPi: [PosixPath('/usr/local/paperpi/config/paperpi.ini'), PosixPath('/etc/default/paperpi.ini')]
    
    opened by txoof 0
  • Slideshow  could not load images, paperpi crashes on exit

    Slideshow could not load images, paperpi crashes on exit

    slideshow was running for several days displaying images every 10ish seconds.

    will need to gather more data to reproduce.

      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/epdlib/Screen.py", line 272, in wrapper
        obj.epd.epd.run()
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/src/it8951/IT8951/interface.py", line 133, in run
        self.spi.write_cmd(Commands.SYS_RUN)
      File "spi.pyx", line 230, in IT8951.spi.SPI.write_cmd
      File "spi.pyx", line 177, in IT8951.spi.SPI.write
      File "spi.pyx", line 117, in IT8951.spi.SPI.transfer
      File "spi.pyx", line 108, in IT8951.spi.SPI.wait_ready
    TimeoutError: Timed out waiting for display to respond
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/home/pi/src/PaperPi/./paperpi/paperpi.py", line 759, in <module>
        exit_code = main()
      File "/home/pi/src/PaperPi/./paperpi/paperpi.py", line 737, in main
        clean_up(cache, screen)
      File "/home/pi/src/PaperPi/./paperpi/paperpi.py", line 353, in clean_up
        screen.clearEPD()
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/epdlib/Screen.py", line 274, in wrapper
        raise ScreenError(f'failed to init display')
    epdlib.Screen.ScreenError: failed to init display
    
    opened by txoof 0
  • improve exit on bad config file

    improve exit on bad config file

    12:38:13 paperpi :get_config_files:251 :INFO       - using configuration files to configure PaperPi: [PosixPath('/home/pi/src/PaperPi/paperpi/config/paperpi.ini'), PosixPath('/home/pi/.config/com.txoof.paperpi/paperpi.ini')]
    Traceback (most recent call last):
      File "/home/pi/src/PaperPi/paperpi/./paperpi.py", line 758, in <module>
        exit_code = main()
      File "/home/pi/src/PaperPi/paperpi/./paperpi.py", line 644, in main
        config_files = get_config_files(cmd_args)
      File "/home/pi/src/PaperPi/paperpi/./paperpi.py", line 254, in get_config_files
        config_files.parse_config()
      File "/home/pi/.local/share/virtualenvs/PaperPi-VBShxqF-/lib/python3.9/site-packages/ArgConfigParse/ArgConfigParse.py", line 227, in parse_config
        self.parser.read(file)
      File "/usr/lib/python3.9/configparser.py", line 697, in read
        self._read(fp, filename)
      File "/usr/lib/python3.9/configparser.py", line 1113, in _read
        raise e
    configparser.ParsingError: Source contains parsing errors: PosixPath('/home/pi/.config/com.txoof.paperpi/paperpi.ini')
    	[line 195]: "'''\n"
    

    It would be good to exit with a better error message and try to identify the problem in the config file rather than just crashing out.

    enhancement 
    opened by txoof 1
  • LMS Plugin Crashes

    LMS Plugin Crashes

    Looks like this is related to LMS plugin being unable to locate active players.

    Nov  5 13:45:14 paperpi paperpi[908]: Traceback (most recent call last):
    Nov  5 13:45:14 paperpi paperpi[908]:   File "/usr/local/paperpi/paperpi.py", line 758, in <module>
    Nov  5 13:45:14 paperpi paperpi[908]:     exit_code = main()
    Nov  5 13:45:14 paperpi paperpi[908]:   File "/usr/local/paperpi/paperpi.py", line 731, in main
    Nov  5 13:45:14 paperpi paperpi[908]:     plugins = build_plugins_list(config=config, resolution=screen.resolution,
    Nov  5 13:45:14 paperpi paperpi[908]:   File "/usr/local/paperpi/paperpi.py", line 431, in build_plugins_list
    Nov  5 13:45:14 paperpi paperpi[908]:     my_plugin.update()
    Nov  5 13:45:14 paperpi paperpi[908]:   File "/usr/local/paperpi/library/Plugin.py", line 165, in update
    Nov  5 13:45:14 paperpi paperpi[908]:     is_updated, data, priority = self.update_function(*args, **kwargs)
    Nov  5 13:45:14 paperpi paperpi[908]:   File "/usr/local/paperpi/plugins/lms_client/lms_client.py", line 139, in update_function
    Nov  5 13:45:14 paperpi paperpi[908]:     lms_status = build_lms()
    Nov  5 13:45:14 paperpi paperpi[908]:   File "/usr/local/paperpi/plugins/lms_client/lms_client.py", line 103, in build_lms
    Nov  5 13:45:14 paperpi paperpi[908]:     self.my_lms = QueryLMS.QueryLMS(player_name=player_name, handle_requests_exceptions=True)
    Nov  5 13:45:14 paperpi paperpi[908]:   File "/usr/local/paperpi/.venv/lib/python3.9/site-packages/QueryLMS/QueryLMS.py", line 80, in __init__
    Nov  5 13:45:14 paperpi paperpi[908]:     self.set_server()
    Nov  5 13:45:14 paperpi paperpi[908]:   File "/usr/local/paperpi/.venv/lib/python3.9/site-packages/QueryLMS/QueryLMS.py", line 195, in set_server
    Nov  5 13:45:14 paperpi paperpi[908]:     for p in self.get_players():
    Nov  5 13:45:14 paperpi paperpi[908]:   File "/usr/local/paperpi/.venv/lib/python3.9/site-packages/QueryLMS/QueryLMS.py", line 330, in get_players
    Nov  5 13:45:14 paperpi paperpi[908]:     players = players['players_loop']
    Nov  5 13:45:14 paperpi paperpi[908]: KeyError: 'players_loop'
    Nov  5 13:45:15 paperpi systemd[1]: paperpi-daemon.service: Main process exited, code=exited, status=1/FAILURE
    Nov  5 13:45:15 paperpi systemd[1]: paperpi-daemon.service: Failed with result 'exit-code'.
    
    opened by txoof 0
Owner
Aaron Ciuffo
Aaron Ciuffo
To check my COVID-19 vaccine appointment, I wrote an infinite loop that sends me a Whatsapp message hourly using Twilio and Selenium. It works on my Raspberry Pi computer.

COVID-19_vaccine_appointment To check my COVID-19 vaccine appointment, I wrote an infinite loop that sends me a Whatsapp message hourly using Twilio a

Ayyuce Demirbas 24 Dec 17, 2022
Mengzhan (John) code for Closed Loop Control system of Sharp Wave Ripples in Hippocampus CA3 region

ClosedLoopControl_Yu Mengzhan (John) code for Closed Loop Control system of Sharp Wave Ripples in Hippocampus CA3 region Creating Python Virtual Envir

Mengzhan (John) Liufu 1 Jan 22, 2022
edgetest is a tox-inspired python library that will loop through your project's dependencies, and check if your project is compatible with the latest version of each dependency

Bleeding edge dependency testing Full Documentation edgetest is a tox-inspired python library that will loop through your project's dependencies, and

Capital One 16 Dec 7, 2022
Some ideas and tools to develop Python 3.8 plugins for GIMP 2.99.4

gimp-python-development Some ideas and tools to develop Python 3.8 plugins for GIMP 2.99.4. GIMP 2.99.4 is the latest unstable pre-release of GIMP 3.

Ismael Benito 53 Sep 25, 2022
Plugins for Agisoft Metashape

Данные плагины предназначены для расширения функциональных возможностей Agisoft Metashape. Плагины представляют собой отдельные программы с собственным интерфейсом, которые запускаются внутри Agisoft Metashape.

GeoScan 17 Dec 10, 2022
This repository collects nice scripts ("plugins") for the SimpleBot bot for DeltaChat.

Having fun with DeltaChat This repository collects nice scripts ("plugins") for the SimpleBot bot for DeltaChat. DeltaChat is a nice e-mail based mess

Valentin Brandner 3 Dec 25, 2021
Simple GUI menu for micropython using a rotary encoder and basic display.

Micropython encoder based menu This is a simple menu system written in micropython. It uses a switch, a rotary encoder and an OLED display.

null 80 Jan 7, 2023
An addin for Autodesk Fusion 360 that lets you view your design in a Looking Glass Portrait 3D display

An addin for Autodesk Fusion 360 that lets you view your design in a Looking Glass Portrait 3D display

Brian Peiris 12 Nov 2, 2022
This is a Fava extension to display a grouped portfolio view in Fava for a set of Beancount accounts.

Fava Portfolio Summary This is a Fava extension to display a grouped portfolio view in Fava for a set of Beancount accounts. It can also calculate MWR

null 18 Dec 26, 2022
How to access and display MyEnergi data

MyEnergi-Python-Example How to access and display MyEnergi data Windows PC Install a version of Python typically 3.10 The Python code here needs addit

G6EJD 8 Nov 28, 2022
gwcheck is a tool to check .gnu.warning.* sections in ELF object files and display their content.

gwcheck Description gwcheck is a tool to check .gnu.warning.* sections in ELF object files and display their content. For an introduction to .gnu.warn

Frederic Cambus 11 Oct 28, 2022
In this project, we are going to display the battery notification and the time left for the battery to drain out using the battery capacity value.

In this project, we are going to display the battery notification and the time left for the battery to drain out using the battery capacity value.

Ritoban Biswas 1 Dec 20, 2021
A service to display a quick summary of a project on GitHub.

A service to display a quick summary of a project on GitHub. Usage ?? Paste the code below with details filled in as specified below into your Readme.

Rohit V 8 Dec 6, 2022
Chemical Analysis Calculator, with full solution display.

Chemicology Chemical Analysis Calculator, to solve problems efficiently by displaying whole solution. Go to releases for downloading .exe, .dmg, Linux

Muhammad Moazzam 2 Aug 6, 2022
Bootstraparse is a personal project started with a specific goal in mind: creating static html pages for direct display from a markdown-like file

Bootstraparse is a personal project started with a specific goal in mind: creating static html pages for direct display from a markdown-like file

null 1 Jun 15, 2022
Streamlit component to display topics from Streamlit's community forum related to any exception.

streamlit-forum Streamlit component to display topics from Streamlit's community forum related to any exception. Installation pip install streamlit-fo

Snehan Kekre 7 Jul 15, 2022
Display your data in an attractive way in your notebook!

Bloxs Bloxs is a simple python package that helps you display information in an attractive way (formed in blocks). Perfect for building dashboards, re

MLJAR 192 Dec 28, 2022
Rock 💎 Paper 📝 Scissors ✂️ Lizard 🦎 Spock 🖖

Rock ?? Paper ?? Scissors ✂️ Lizard ?? Spock ?? If you’ve seen The Big Bang Theory, you’ve heard of a game called “Rock, Paper, Scissors, Lizard, Spoc

AmirHossein Mohammadi 16 Jun 19, 2022
How to create the game Rock, Paper, Scissors in Python

Rock, Paper, Scissors! If you want to learn how to do interactive games using Python, then this is great start for you. In this code, You will learn h

SplendidSpidey 1 Dec 18, 2021