{"id":13585152,"url":"https://github.com/mendhak/waveshare-epaper-display","last_synced_at":"2025-04-07T21:11:16.437Z","repository":{"id":42201261,"uuid":"183752195","full_name":"mendhak/waveshare-epaper-display","owner":"mendhak","description":"At-a-glance dashboard for Raspberry Pi with a Waveshare ePaper 7.5 Inch HAT. Date/Time, Weather, Alerts, Google/Outlook Calendar","archived":false,"fork":false,"pushed_at":"2025-03-25T22:20:42.000Z","size":4278,"stargazers_count":481,"open_issues_count":11,"forks_count":73,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-03-31T20:06:58.188Z","etag":null,"topics":["dashboard","epaper","raspberry-pi","weather"],"latest_commit_sha":null,"homepage":"https://code.mendhak.com/raspberrypi-epaper-dashboard/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mendhak.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-04-27T09:14:50.000Z","updated_at":"2025-03-26T01:11:48.000Z","dependencies_parsed_at":"2023-10-16T10:11:39.517Z","dependency_job_id":"30e32613-3e34-42d5-be85-bbba905d2cf4","html_url":"https://github.com/mendhak/waveshare-epaper-display","commit_stats":{"total_commits":481,"total_committers":12,"mean_commits":"40.083333333333336","dds":0.08316008316008316,"last_synced_commit":"6fb8346c4ebf14709433ed6d01fe28255f3b52dc"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mendhak%2Fwaveshare-epaper-display","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mendhak%2Fwaveshare-epaper-display/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mendhak%2Fwaveshare-epaper-display/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mendhak%2Fwaveshare-epaper-display/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mendhak","download_url":"https://codeload.github.com/mendhak/waveshare-epaper-display/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247730068,"owners_count":20986404,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dashboard","epaper","raspberry-pi","weather"],"created_at":"2024-08-01T15:04:46.142Z","updated_at":"2025-04-07T21:11:16.419Z","avatar_url":"https://github.com/mendhak.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"Instructions on setting up a Raspberry Pi Zero WH with a Waveshare ePaper 7.5 Inch HAT.\nThe screen will display date, time, weather icon with high and low, and calendar entries.\n\n![Default Layout](screenshots/display.png)![Private Mode](screenshots/pvt_literature_irl.png)  \n\n- [Shopping list](#shopping-list)\n- [Setup the PI](#setup-the-pi)\n- [Using this application](#using-this-application)\n- [Setup dependencies](#setup-dependencies)\n- [Set your location](#set-your-location)\n- [Pick a Weather provider](#pick-a-weather-provider)\n  - [OpenWeatherMap](#openweathermap)\n  - [Met Office (UK)](#met-office-uk)\n  - [AccuWeather](#accuweather)\n  - [Met.no](#metno)\n  - [Met Éireann (Ireland)](#met-éireann-ireland)\n  - [Weather.gov (US)](#weathergov-us)\n  - [Climacell (tomorrow.io)](#climacell-tomorrowio)\n  - [VisualCrossing](#visualcrossing)\n  - [SMHI (Sweden)](#smhi-sweden)\n- [Pick a severe weather warning provider](#pick-a-severe-weather-warning-provider)\n  - [Met Office (UK)](#met-office-uk-1)\n  - [Weather.gov (US)](#weathergov-us-1)\n  - [Met Éireann (Ireland)](#met-éireann-ireland-1)\n- [Pick a Calendar provider](#pick-a-calendar-provider)\n  - [Google Calendar setup](#google-calendar-setup)\n  - [Outlook Calendar](#outlook-calendar)\n  - [ICS Calendar](#ics-calendar)\n  - [CalDav Calendar](#caldav-calendar)\n- [Pick a layout](#pick-a-layout)\n- [Run it](#run-it)\n  - [Automate it](#automate-it)\n- [Adding custom data](#custom-data)\n- [Choosing a different language](#how-to-use-a-different-display-language)\n- [Choosing a different font](#how-to-use-a-different-font)\n- [Privacy Mode](#privacy-mode)\n- [Troubleshooting](#troubleshooting)\n- [Waveshare documentation and sample code](#waveshare-documentation-and-sample-code)\n- [Debugging locally](#debugging-locally)\n\n\n## Shopping list\n\n[Waveshare 7.5 inch epaper display HAT 640x384](https://www.amazon.co.uk/gp/product/B075R4QY3L/)\n[Raspberry Pi Zero WH (presoldered header)](https://www.amazon.co.uk/gp/product/B07BHMRTTY/)\n[microSDHC card](https://www.amazon.co.uk/gp/product/B073K14CVB)\n\n## Setup the PI\n\n### Prepare the Pi\n\nUse the [Raspberry Pi imager](https://www.raspberrypi.com/software/) and install Raspberry Pi OS (tested with Raspberry Pi OS Lite, October 2023 edition).   \n\nEnsure that you have SSH access, or direct access, to the Raspberry Pi, and that it can connect to the Internet to download packages. In most cases you would do this via the imager's settings screen: set the username and password, enable SSH and set up WiFi access. \n\n\n### Connect the display\n\nTurn the Pi off, then put the HAT on top of the Pi's GPIO pins.\n\nConnect the ribbon from the epaper display to the extension.  To do this you will need to lift the black latch at the back of the connector, insert the ribbon slowly, then push the latch down.  \n\nNow turn the Pi back on and SSH into it.  \n\n\n## Using this application\n\n### Clone it\n\ngit clone this repository in the `/home/pi` directory.\n\n    cd ~\n    sudo apt update \u0026\u0026 sudo apt upgrade\n    sudo apt install git\n    git clone --recursive https://github.com/mendhak/waveshare-epaper-display.git\n\nThis should create a `/home/pi/waveshare-epaper-display` directory.\n\n### Setup dependencies\n\n    cd waveshare-epaper-display\n    sudo apt install gsfonts fonts-noto python3 python3-pip pigpio libopenjp2-7 python3-venv libjpeg-dev libxslt1-dev fontconfig libcairo2\n    python3 -m venv --system-site-packages .venv\n    .venv/bin/pip3 install -r requirements.txt\n    sudo raspi-config nonint do_spi 0  #This enables SPI\n    sudo reboot\n\n\n### Waveshare version\n\nCopy `env.sh.sample` (example environment variables) to `env.sh`\n\nModify the `env.sh` file and set the version of your Waveshare 7.5\" e-Paper Module  (newer ones are version 2, red one is 2B)\n\n    export WAVESHARE_EPD75_VERSION=2\n\n## Set your location\n\nWhichever weather provider you use, you'll need to provide the location and units to display in.\n\nModify the `env.sh` file and update with the latitude and longitude of your location.\nAs needed, change the temperature format (CELSIUS or FAHRENHEIT).\n\n    export WEATHER_LATITUDE=51.3656\n    export WEATHER_LONGITUDE=0.1963\n    export WEATHER_FORMAT=CELSIUS\n\n## Pick a Weather provider\n\nYou can pick between OpenWeatherMap, Met Office, AccuWeather, Met.no, Weeather.gov, VisualCrossing, and Climacell to provide temperature and weather forecasts.\nYou can switch between them too, by providing the keys and commenting out other ones, but remember to delete the `cache_weather.json` if you switch weather providers.\n\n### OpenWeatherMap\n\nRegister on the [OpenWeathermap](https://openweathermap.org) website, and go to the [API Keys page](https://home.openweathermap.org/api_keys), that's the key you'll need.\nAdd it to the env.sh file.\n\n    export OPENWEATHERMAP_APIKEY=xxxxxx\n\n### Met Office (UK)\n\nCreate an account [on the Met Office Weather DataHub](https://datahub.metoffice.gov.uk) site.\nNext, [under subscriptions](https://datahub.metoffice.gov.uk/profile/subscriptions) - subscribe to the 'Site Specific' product 'Global Spot'. This will get you an API key. \n\nAdd the API key to the env.sh file:\n\n    export METOFFICEDATAHUB_API_KEY=eyJ.........\n\n### AccuWeather\n\nRegister on the [AccuWeather](https://developer.accuweather.com/) site.\nNext, [register a new application](https://developer.accuweather.com/user/me/apps).\nI just named it Personal, marked it as Limited Trial, Internal App, Business to Consumer.\nOnce you do this you'll get an API Key, save it.\n\nYou'll also need an AccuWeather Location Key.\nDo a normal [AccuWeather search](https://www.accuweather.com/) for your location.\nThe last number in the URL is the Location Key.  In the example of [London](https://www.accuweather.com/en/gb/london/ec4a-2/weather-forecast/328328), it's `328328`.\n\nAdd the API Key and Location Key to the `env.sh`.\n\n    export ACCUWEATHER_APIKEY=xxxxxx\n    export ACCUWEATHER_LOCATIONKEY=328328\n\n### Met.no\n\nMet.no's [Terms of Service](https://api.met.no/doc/TermsOfService) requires you to identify yourself.  The purpose is to ensure they can contact you in case you overload or abuse their servers.  For this reason, you just need to set your email address in `env.sh` like so:\n\n    export METNO_SELF_IDENTIFICATION=you@example.com\n\nNote that the Met.no API provides 6 hours of forecast, rather than a full day.\n\n### Met Éireann (Ireland)\n\n[Met Éireann](https://www.met.ie/) publish their forecast data under a [Creative Commons Attribution 4.0 International license (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/).  All you need to do to use it is to uncomment this line in `env.sh`:\n\n    export WEATHER_MET_EIREANN=1\n\nNote that a condition of use of this data is that weather alerts be displayed, so ALERT_MET_EIREANN_FEED_URL should be uncommented, too.\n\n### Weather.gov (US)\n\nWeather.gov requires you to [identify your application](https://www.weather.gov/documentation/services-web-api).  This can be any made up string, or an email address.\nSet its value in the `env.sh` as shown:\n\n    export WEATHERGOV_SELF_IDENTIFICATION=you@example.com\n\nWarning: YMMV. During my testing, I found the weather.gov API would start returning errors and then suddenly work again.\n\n### Climacell (tomorrow.io)\n\nRegister on the [Climacell site](https://www.climacell.co/weather-api/), and when you do you should be given an API Key.\nModify the `env.sh` file and put your Climacell API key in there.\n\n    export CLIMACELL_APIKEY=xxxxxx\n\n### VisualCrossing\n\nRegister on [VisualCrossing](https://www.visualcrossing.com/). Under Account Details, you should be able to generate an API key. Once you have that, simply add it to `env.sh` as shown:\n\n    export VISUALCROSSING_APIKEY=XXXXXXXXXXXXXXXXXXXXXX\n\n### SMHI (Sweden)\n\nSMHI requires you to identify yourself.  Just set your own email,\n\n    export SMHI_SELF_IDENTIFICATION=you@example.com\n\n## Pick a severe weather warning provider\n\nThis is an optional step.  By doing nothing you simply won't see severe weather warnings.\n\n### Met Office (UK)\n\nGo to the [Met Office RSS Feeds page](https://www.metoffice.gov.uk/weather/guides/rss) and copy the URL of the RSS feed based on your region.\nSet its value in the `env.sh` as shown below. For example, London would be:\n\n    export ALERT_METOFFICE_FEED_URL=https://www.metoffice.gov.uk/public/data/PWSCache/WarningsRSS/Region/se\n\n### Weather.gov (US)\n\nWeather.gov requires you to [identify your application](https://www.weather.gov/documentation/services-web-api).  This can be any made up string, or an email address.\nSet its value in the `env.sh` as shown:\n\n    export ALERT_WEATHERGOV_SELF_IDENTIFICATION=you@example.com\n\nThis provider will use the same latitude and longitude as specified for the weather provider.\n\nWarning: YMMV. During my testing, I found the weather.gov API would start returning errors and then suddenly work again.\n\n### Met Éireann (Ireland)\n\nTo use alerts from Met Éireann, visit  https://www.met.ie/Open_Data/json/ and choose the appropriate \"warning_EIXX\" JSON file for your region, using each county's FIPS code.  This code can be found in the table on http://www.statoids.com/uie.html,\nin the pre-2014 section.  For example, this is the file for Dublin:\n\n    export ALERT_MET_EIREANN_FEED_URL=https://www.met.ie/Open_Data/json/warning_EI07.json\n\n## Pick a Calendar provider\n\nYou can use Google Calendar or Outlook Calendar to display events.\n\n### Google Calendar setup\n\nThe script will by default get its info from your primary Google Calendar.  If you need to pick a specific calendar you will need its ID.  To get its ID, open up [Google Calendar](https://calendar.google.com) and go to the settings for your preferred calendar.  Under the 'Integrate Calendar' section you will see a Calendar ID which looks like `xyz12345@group.calendar.google.com`.  Set that value in `env.sh`\n\n```bash\nexport GOOGLE_CALENDAR_ID=xyz12345@group.calendar.google.com\n```\n\n#### Google Calendar token\n\nThe Oauth process needs to complete once manually in order to allow the Python code to then continuously query Google Calendar for information.\n\nGo to the [Google Cloud Platform library page](https://console.cloud.google.com/apis/library), search for and enable the [Calendar API](https://console.cloud.google.com/apis/api/calendar-json.googleapis.com/overview).\n\nNext, head over to the [API Dashboard Credentials page](https://console.cloud.google.com/apis/credentials), and create new credentials of type \"OAuth Client ID\".  For application type, choose \"Desktop app\" and give it a name such as \"Epaper Display\".  When presented, download or copy the `credentials.json` file and add it to this directory.\n\nYou can now kick off the authentication process. On the Raspberry Pi, run:\n\n    .venv/bin/python3 screen-calendar-get.py\n\nThe script will prompt you to visit a URL in your browser and then wait.  Copy the URL, open it in a browser and you will go through the login process.  When the OAuth workflow tries to redirect back (and fails), copy the URL it was trying to go to (eg: http://localhost:8080/...) and in another SSH session with the Raspberry Pi,\n\n    curl \"http://localhost:8080/...\"\n\nOn the first screen you should see the auth flow complete, and a new `token.pickle` file appears.  The Python script should now be able to run in the future without prompting required.\n\nI also have a [post here with screenshots](https://github.com/mendhak/waveshare-epaper-display/issues/19#issuecomment-780397819) walking through the process.\n\n### Outlook Calendar\n\nThe setup is much simpler, just run this script which will give instructions on how to login:\n\n    .venv/bin/python3 outlook_util.py\n\nLogin with the Microsoft account you want to get the calendar from, and accept the consent screen.\nAfter a moment, the script will then display a set of Calendar IDs and some sample events from those Calendars.\nCopy the ID of the calendar you want, and add it to env.sh like so:\n\n    export OUTLOOK_CALENDAR_ID=AQMkAxyz...\n\nNote that if you set an Outlook Calendar ID, the Google Calendar will be ignored.\n\n### ICS Calendar\n\nICS is simple, get the ICS URL for a calendar, and place it in `env.sh`.\n\n    export ICS_CALENDAR_URL=https://calendar.google.com/calendar/ical/xxxxxxxxxxxx/xxxxxxxxxxxxxx/basic.ics\n\nThere is no username/password support.\n\n### CalDav Calendar\n\nFor CalDav you will need the CalDav URL, username, and password.\n\n    export CALDAV_CALENDAR_URL=https://nextcloud.example.com/remote.php/dav/principals/users/123456/\n    export CALDAV_USERNAME=username\n    export CALDAV_PASSWORD=password\n\nSome CalDav features may not work well as the protocol is heavily undocumented, proprietary, and many servers don't implement it the same way.\n\n## Pick a layout\n\nThis is an optional step.  There are a few different layouts to choose from.\n\n\n| `export SCREEN_LAYOUT=1` \u003cbr /\u003eThis is the default | `export SCREEN_LAYOUT=2` \u003cbr /\u003eMore calendar entries and less emphasis on weather and time |\n| --- | --- |\n| [![Layout 1](screenshots/001.png)](screenshots/001.png) | [![Layout 2](screenshots/002.png)](screenshots/002.png) |\n\n| `export SCREEN_LAYOUT=3` \u003cbr /\u003eCalendar entries on left, less emphasis on weather | `export SCREEN_LAYOUT=4` \u003cbr /\u003eShows hour instead of time. Meant for color screens. |\n| --- | --- |\n| [![Layout 3](screenshots/003.png)](screenshots/003.png) | [![Layout 4](screenshots/004.png)](screenshots/004.png) |\n\n| `export SCREEN_LAYOUT=5` \u003cbr /\u003eCalendar entries on left, with a month calendar for at-a-glance |  |\n| --- | --- |\n| [![Layout 5](screenshots/005.png)](screenshots/005.png) | |\n\n\n\n\n## Run it\n\nRun `./run.sh` which should query the weather provider and Google/Outlook Calendar.  It will then create a png, convert to a 1-bit black and white bmp, then display the bmp on screen.\n\nUsing a 1-bit, low grade BMP is what allows the screen to refresh relatively quickly. Calling the BCM code to do it takes about 6 seconds.\nRendering a high quality PNG or JPG and rendering to screen with Python takes about 35 seconds.\n\n### Automate it\n\nOnce you've proven that the run works, and an image is sent to your epaper display, you can automate it by setting up a cronjob.\n\n    crontab -e\n\nAdd this entry so it runs every minute:\n\n    * * * * * cd /home/pi/waveshare-epaper-display \u0026\u0026 bash run.sh \u003e run.log 2\u003e\u00261\n\nThis will cause the script to run every minute, and write the output as well as errors to the run.log file.\n\n## Custom Data\n\nThis is an optional step, to add your own custom data to the screen.  For example this could be API calls, data from Home Assistant, PiHole stats, or something external.\n\nRename `screen-custom-get.py.sample` to `screen-custom-get.py`. Do your custom code, and set the value of `custom_value_1` to the value you want to display. Run `./run.sh` and it'll appear on screen.\n\nNext, modify `screen-custom.svg` and change the various x, y, font size values to adjust its appearance and position.\nYou can add more values by adding more SVG elements for custom_value_2, custom_value_3, and so on, and set its value in the `output_dict` in `screen-custom.get.py`.\n\n## How to use a different display language\n\nThe default locale of the system will be used to generate the time and date formats, including month and day names.  On Raspberry Pi OS the default is usually `en_GB`.  \n\nUse the following instructions to install and try out other locales, or even force en_GB. \n\nTo see the current default locale, run `locale`.  \nTo see all the locales installed on the system, use `locale -a`.  \n\nTo install a new locale, go through the locale wizard:\n\n    sudo dpkg-reconfigure locales\n\nSelect the locales you want to install, be sure to pick the ones that have `.UTF-8` in the name. \n\nEdit the `env.sh` file and at the top, set the language like so: \n\n    export LANG=ko_KR.UTF-8\n\nThe next time `run.sh` runs, the output should have the chosen language.\n\n### Fonts for non-western languages\n\nSome languages may not render well because the default Raspberry Pi system fonts don't have all the characters needed to display on screen. For such cases, you'll need to find and install a font that supports all the characters you want to display. \n\nChinese/Japanese/Korean should already be taken care of by installing the `fonts-noto` package. But sometimes just installing that isn't enough, you'll also have to set it as the default font, see the [font instructions](#how-to-use-a-different-font). \n\nThe reason this is necessary: the SVG renderer [does not support fallback fonts](https://github.com/Kozea/CairoSVG/issues/72#issuecomment-132500219) which means that if a font doesn't have a certain character, it won't ask the system for other fonts to help plug the gaps. You'll just see squares. \n\n\n## How to use a different font\n\nThe default font is set to `sans-serif` which on a Raspberry Pi defaults to DejaVu Sans. It's a decent font, wide, and visible, and works for most western languages.  \n\nIn this example I'll replace it with Noto Sans. \nFirst run this command, it will show the current font being used. \n\n```\n$ fc-match sans-serif\nDejaVuSans.ttf: \"DejaVu Sans\" \"Book\"\n```\n\nInstall Noto fonts.\n\n```\nsudo apt install fonts-noto\n```\n\nNow create a font config file if it doesn't already exist. \n\n```\nmkdir -p ~/.config/fontconfig/conf.d\nnano ~/.config/fontconfig/conf.d/00-fonts.conf\n```\n\nSet the contents of the 00-fonts.conf file:\n\n```xml\n\u003c?xml version='1.0'?\u003e\n\u003c!DOCTYPE fontconfig SYSTEM 'fonts.dtd'\u003e\n\u003cfontconfig\u003e\n  \u003calias\u003e\n    \u003cfamily\u003esans-serif\u003c/family\u003e\n    \u003cprefer\u003e\n        \u003cfamily\u003eNoto Sans\u003c/family\u003e\n    \u003c/prefer\u003e\n  \u003c/alias\u003e\n\u003c/fontconfig\u003e\n```\n\nThis tells the system to prefer 'Noto Sans' if the 'sans-serif' family is requested. You can test it by running:\n\n```\n$ fc-match sans-serif\nNotoSans-Regular.ttf: \"Noto Sans\" \"Regular\"\n```\n\nThe next time `run.sh` runs, the output image should have the chosen font.\n\n## Privacy Mode\n\nThis mode hides away everything and just displays an XKCD comic or a literary quote for the time.  In env.sh, set: \n\n\n| `export PRIVACY_MODE_XKCD=1` \u003cbr /\u003eXKCD comic | `export PRIVACY_MODE_LITERATURE_CLOCK=1` \u003cbr /\u003eLiterature clock mode |\n| --- | --- |\n| [![XKCD](screenshots/pvt_xkcd.png)](screenshots/pvt_xkcd.png) | [![Literature](screenshots/pvt_literature.png)](screenshots/pvt_literature.png) |\n\n\n\n## Troubleshooting\n\nIf the scripts don't work at all, try going through the Waveshare sample code linked below - if you can get those working, this script should work for you too.\n\nYou may want to further troubleshoot if you're seeing or not seeing something expected.\nIf you've set up the cron job as shown above, a `run.log` file will appear which contains some info and errors.\nIf there isn't enough information in there, you can set `export LOG_LEVEL=DEBUG` in the `env.sh` and the `run.log` will contain even more information.\n\nThe scripts cache the calendar and weather information, to avoid hitting weather API rate limits.\nIf you want to force a weather update, you can delete the `cache_weather.json`.\nIf you want to force a calendar update, you can delete the `cache_calendar.pickle` or `cache_outlookcalendar.pickle`.\nIf you want to force a re-login to Google or Outlook, delete the `token.pickle` or `outlooktoken.bin`.\n\n\n## Waveshare documentation and sample code\n\nWaveshare have a [user manual](https://www.waveshare.com/w/upload/7/74/7.5inch-e-paper-hat-user-manual-en.pdf) which you can get to from [their Wiki](https://www.waveshare.com/wiki/7.5inch_e-Paper_HAT)\n\n\nThe [Waveshare demo repo is here](https://github.com/waveshare/e-Paper).  Assuming all dependencies are installed, these demos should work.\n\n    git clone https://github.com/waveshare/e-Paper\n    cd e-Paper\n\n\nThis is the best place to start for troubleshooting - try to make sure the examples given in their repo works for you.\n\n[Readme for the C demo](https://github.com/waveshare/e-Paper/blob/master/RaspberryPi_JetsonNano/c/readme_EN.txt)\n\n[Readme for the Python demo](https://github.com/waveshare/e-Paper/blob/master/RaspberryPi_JetsonNano/python/readme_jetson_EN.txt)\n\n\n## Debugging locally\n\nIt's possible to run and debug the application locally with virtual environments.  The last step fails, as it's trying to write to GPIO, but that's not an issue since the aim of local development is to generate and view the `screen-output.png`.\n\nDo this before opening VSCode:\n\n```bash\n# Generate the virtual environment directory\npython3 -m venv .venv\n# Switch to it\nsource .venv/bin/activate\n# Install dependencies\npip install -r requirements.txt\n```\n\nThen, open VSCode with the project, and it should automatically detect and switch to the virtual environment in the terminal.\n\nTo run the project, just run `./run.sh`.  It will pick up env.sh variables, and run the various Python scripts.\n\nTo debug the project, open a Python script file such as `screen-calendar-get.py` or `screen-weather-get.py`, and press F5.  It will generate a .env from env.sh, and run the script.  It can hit breakpoints, no problem.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmendhak%2Fwaveshare-epaper-display","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmendhak%2Fwaveshare-epaper-display","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmendhak%2Fwaveshare-epaper-display/lists"}