{"id":18709951,"url":"https://github.com/jprusik/desk-status","last_synced_at":"2026-05-04T14:45:12.240Z","repository":{"id":43236954,"uuid":"266799176","full_name":"jprusik/desk-status","owner":"jprusik","description":"A desk status display and check-in device; written in Python for the Raspberry Pi Zero","archived":false,"fork":false,"pushed_at":"2023-10-03T23:07:47.000Z","size":2156,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-05-19T08:13:03.693Z","etag":null,"topics":["bme280","bmp280","check-in","checkin","desk","dht11","dht22","display","nfc","office","oled","python","raspberry-pi","raspberrypi","raspbian","rc522","rfid","rpi","ssd1306","workplace"],"latest_commit_sha":null,"homepage":"https://www.classynemesis.com/blog/desk-display/","language":"Python","has_issues":false,"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/jprusik.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2020-05-25T14:23:29.000Z","updated_at":"2023-02-27T19:00:46.000Z","dependencies_parsed_at":"2024-11-07T12:33:23.945Z","dependency_job_id":"ca03dfeb-8d50-4644-8156-06ee1dbc6f85","html_url":"https://github.com/jprusik/desk-status","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jprusik/desk-status","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jprusik%2Fdesk-status","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jprusik%2Fdesk-status/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jprusik%2Fdesk-status/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jprusik%2Fdesk-status/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jprusik","download_url":"https://codeload.github.com/jprusik/desk-status/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jprusik%2Fdesk-status/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32612318,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"ssl_error","status_checked_at":"2026-05-04T10:08:02.005Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["bme280","bmp280","check-in","checkin","desk","dht11","dht22","display","nfc","office","oled","python","raspberry-pi","raspberrypi","raspbian","rc522","rfid","rpi","ssd1306","workplace"],"created_at":"2024-11-07T12:29:40.454Z","updated_at":"2026-05-04T14:45:12.214Z","avatar_url":"https://github.com/jprusik.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Desk Status Display and Check-in\n\nThis project aims to create an accessible desk-oriented status and check-in system at a low cost at scale. This particular implementation leverages the [Robin](https://robinpowered.com/) platform to retrieve and display desk availability information as well as (optionally) allow touch-less desk check-ins with user NFC/RFID cards/tags.\n\nThe code provided here is based on [mini-ticker](https://github.com/jprusik/mini-ticker), which in turn is based on examples from the [pi-rc522](https://github.com/ondryaso/pi-rc522) and [adafruit-circuitpython-ssd1306](https://github.com/adafruit/Adafruit_CircuitPython_SSD1306) projects.\n\n## Requirements\n\n- Raspberry Pi computer with installed header pins and power source\n- [compatible](https://www.raspberrypi.org/documentation/installation/sd-cards.md) microSD card\n- SSD1306-based 128x64 or 128x32 pixel OLED display\n- (Optional) RC522 module (for RFID/NFC communication)\n\n## Setup\n\n**Note:** This project covers the software setup of your desk status device. For hardware models and assembly, see the [desk-status-model](https://github.com/jprusik/desk-status-model) project.\n\n- [Install Raspberry Pi OS Lite](https://www.raspberrypi.org/downloads/raspberry-pi-os/) (formerly, \"Raspbian\") on a microSD/SD card\n- Set up the Raspberry Pi to run headless and connect it to your network ([guide](https://www.raspberrypi.org/documentation/configuration/wireless/headless.md))\n  - Add a file named `ssh` to the root of the SD card.\n  - (Optional) set up your network's wifi configuration by adding a file named `wpa_supplicant.conf` to the root of the SD card. The contents should look like:\n\n    ```config\n    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev\n    update_config=1\n    country=\u003cInsert 2 letter ISO 3166-1 country code here\u003e\n\n    network={\n     ssid=\"\u003cName of your wireless LAN\u003e\"\n     psk=\"\u003cPassword for your wireless LAN\u003e\"\n    }\n    ```\n\n  - (Optional) Update your device hostname by editing `sudo nano /etc/hostname` and `/etc/hosts` (from \"localhost\") to your desired name.\n- [ssh into the Raspberry Pi](https://www.raspberrypi.org/documentation/remote-access/ssh/):\n- Do `sudo raspi-config` and set up:\n  - \"Interfacing Options\" \u003e \"Interfacing Options\" \u003e \"I2C\" \u003e select \"Yes\"\n  - (Optional) \"Localisation Options\"\n  - set your device's timezone (if not set previously) with `timedatectl` (e.g. `sudo timedatectl set-timezone America/New_York`)\n  - (Optional) \"Change User Password\"\n    **Important!** Because we're using Raspberry Pi OS, the default user is `pi` with a password of `raspberry` - it is strongly advised to change the password, at minimum.\n- Install dependencies:\n\n  ```shell\n  sudo apt update \u0026\u0026 sudo apt-get install git python3-pip python3-dev libtiff5-dev libopenjp2-7-dev\n  ```\n\n- Clone this repo and `cd desk-status`\n- Install required packages with `pip3 install -r requirements.txt`\n- (Optional) Edit `/boot/config.txt` at the line `dtparam=i2c_arm=on` and replace it with:\n\n  ```shell\n  dtparam=i2c_arm=on,i2c_arm_baudrate=400000\n  ```\n\n- (Optional) If using an RC522 module for RFID/NFC communication, edit `/boot/config.txt` to include the following settings:\n\n  ```settings\n  device_tree_param=spi=on\n  dtoverlay=spi-bcm2708\n  dtparam=spi=on\n  ```\n\nEdit or create `.env` in the same directory as `status_display.py` with the following contents:\n\n```shell\nAPI_ACCESS_TOKEN=\"AABBCCDDEEFFGG\" # Your Robin API access token\nAPI_DOMAIN_URL=\"api.robinpowered.com\" # The domain for Robin API calls\nSEAT_ID=0 # The id of the Robin desk this display is running for\nORG_ID=0 # The id of your Robin organization\nTIMEZONE_STRING=\"America/New_York\" # The desk's tz database time zone name ('e.g. America/New_York')\nAPI_POLL_INTERVAL=60 # How many seconds to wait before updating the desk status\nRED_GPIO=14 # GPIO pin the red led is attached to\nGREEN_GPIO=18 # GPIO pin the green led is attached to\nBLUE_GPIO=15 # GPIO pin the blue led is attached to\n```\n\n## Running the code\n\nOnce the `status_display.py` script is executed, it will continue to run until the process is terminated. You can manually execute the script on demand, or automatically execute on shell start by editing `/etc/profile` and appending the following to the end of the file:\n\n```shell\npython3 /home/pi/desk-status\n```\n\nAlternatively, run the script as a service:\n\n- Run `sudo systemctl --force --full edit deskstatus.service` and enter the config:\n\n  ```config\n  [Unit]\n  Description=Robin Desk status display\n  Requires=network.target\n  After=multi-user.target\n\n  [Service]\n  WorkingDirectory=/home/pi/desk-status\n  User=pi\n  ExecStart=python3 .\n  ExecStopPost=python3 -c 'import status_display; status_display.shutdown()'\n\n  [Install]\n  WantedBy=multi-user.target\n  ```\n\n- Enable the service with `sudo systemctl enable --now deskstatus.service`, and start it with `sudo systemctl start deskstatus.service`\n\n## Notes\n\n- This build assumes Raspberry Pi Zero hardware - no other Raspberry Pi hardware has been tested with this code.\n- [Ubuntu Font Family](https://design.ubuntu.com/font/) is included in `/fonts` by default. If you wish to use a different font, add them to the `/fonts` directory and update the import references in `status_display.py` (note, line spacing currently presumes Ubuntu fonts and may require adjustments when using other fonts).\n- ProTip: You can access the the target pi on your network using the pi's network DNS reference (`raspberrypi` by default). This is particularly useful if your network has dynamic IP address assignment; you can simply `ssh pi@raspberrypi.local`)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjprusik%2Fdesk-status","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjprusik%2Fdesk-status","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjprusik%2Fdesk-status/lists"}