Initial backup of LTP-305G matrix clock setup on matrixpi

Captures everything needed to redeploy the two-display clock (hour on I2C
0x61, minute on I2C 0x63) on a fresh Pi:

- Both systemd units (matrix0x61.service, matrix0x63.service)
- Deployed Pimoroni script tree, including the local %I (12-hour) clock
  customization
- Vendored upstream sources (ltp305-python, breakout-garden) so restore is
  fully offline-capable
- Boot config snippet enabling I2C
- install.sh that wires it all back up idempotently
- Inventory doc cross-referencing every live-system path

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
dissimulo
2026-05-06 01:32:39 -07:00
commit 030172f523
99 changed files with 4445 additions and 0 deletions

62
README.md Normal file
View File

@@ -0,0 +1,62 @@
# matrix-pi
Backup of the Pimoroni LTP-305G LED matrix display setup running on `matrixpi`
under the `dissimulo` user. Two LTP-305G modules are wired to the I2C bus and
display the current time as a clock — hour on the left module (I2C `0x61`),
minute on the right (I2C `0x63`).
## Hardware
- Raspberry Pi (running Debian Bookworm, kernel 6.6.x)
- 2 × Pimoroni LTP-305G breakouts on I2C bus 1
- `0x61` — hour digits
- `0x63` — minute digits
## What's in here
| Path | Purpose |
| --- | --- |
| `systemd/` | The two systemd units that run the clock at boot |
| `deployed/` | Mirror of the on-disk script tree the units invoke (includes the local `%I` 12-hour customization to `clock.py`) |
| `vendor/ltp305-python/` | Vendored copy of the Pimoroni `ltp305` Python library (offline install fallback) |
| `vendor/breakout-garden/` | Vendored copy of Pimoroni's Breakout Garden tooling (used for I2C autodetect) |
| `config/boot-firmware-config.txt.snippet` | The `/boot/firmware/config.txt` lines that enable I2C |
| `install.sh` | Idempotent restore script |
| `docs/inventory.md` | Source-of-truth inventory of every LTP-305G-related file on the live system |
## Restoring on a fresh Pi
1. Flash Raspberry Pi OS (Bookworm or later), create user `dissimulo`.
2. Ensure I2C is enabled — either via `raspi-config` or by appending the line
from `config/boot-firmware-config.txt.snippet` to `/boot/firmware/config.txt`
and rebooting.
3. Wire the two LTP-305G breakouts; confirm with `i2cdetect -y 1` that they
appear at `0x61` and `0x63`. (Install `i2c-tools` if missing.)
4. From a clone of this repo, run:
```
sudo ./install.sh
```
This installs the `ltp305` Python package from `vendor/`, drops the
customized scripts into `/home/dissimulo/Pimoroni/ltp305/`, and enables both
systemd units.
5. Verify:
```
systemctl status matrix0x61.service matrix0x63.service
```
## Local customization vs. upstream
The deployed `clock.py` differs from the upstream Pimoroni `ltp305-python`
example by one line — the `hour` format is `%I` (12-hour) instead of `%H`
(24-hour). This is preserved in `deployed/home/dissimulo/Pimoroni/ltp305/examples/clock.py`.
## Upstream provenance
Vendored sources were captured from these commits:
- `pimoroni/ltp305-python` @ `bf859fe6cddf8cffcb12d62bad8f21e0bbb9fc42`
- `pimoroni/breakout-garden` @ `9c331458ee8c4732dbc783a6409ef53d671d321b`