Bridge that pushes Tesserae-rendered frames to OpenDisplay BLE e-paper tags.
Project description
tesserae-opendisplay
A bridge that pushes Tesserae-rendered dashboards to OpenDisplay BLE e-paper tags.
Tesserae renders your dashboards on the server; OpenDisplay tags are driven over Bluetooth LE. This bridge sits between them: it polls Tesserae's frame endpoint for each tag over the network, and when a frame changes it pushes the image to the tag over BLE with the py-opendisplay SDK, which dithers for whatever panel the tag advertises. One bridge drives many tags, and you can run several bridges (one per BLE cluster) against the same Tesserae server.
Requirements
- A running Tesserae server reachable over the network.
- A machine near your tags with a Bluetooth LE adapter (a Pi, a mini PC, an HA box) to run the bridge on.
- Python 3.11+.
Install
pip install tesserae-opendisplay
Find your tags
tesserae-opendisplay discover
This scans for tags in range and prints a [[tags]] stub for each, including the panel size it reads off the tag, so you can paste it straight into your config.
Configure
Create config.toml:
server_url = "http://tesserae.local:8000"
poll_interval_s = 300 # fallback cadence; the server can override per tag
[[tags]]
device_id = "kitchen" # the Tesserae device id (you choose it)
ble = "AA:BB:CC:DD:EE:FF" # tag BLE MAC (or a device name to auto-scan)
width = 800 # the tag's panel, from `discover`
height = 480
pairing_code = "AB12CD" # optional: a Tesserae pairing code to register this tag once
# token = "..." # or a device token you already hold
# rotate = 0 # optional 0 / 90 / 180 / 270
# fit = "contain" # optional contain / cover / stretch / crop
# dither = "burkes" # optional dither mode
# refresh = "full" # optional full / partial
[[tags]]
device_id = "hall"
ble = "OpenDisplay-A1"
width = 400
height = 300
pairing_code = "AB12CD"
Generate a pairing code in Tesserae under Settings → Devices. The bridge registers each tag with that code on first run, then caches the token in config.toml.state.json so later runs skip registration. After a tag is registered it shows up in Tesserae like any other device: bind a dashboard, add it to a rotation, schedule it.
Run
tesserae-opendisplay --config config.toml
Each cycle the bridge asks Tesserae for every tag's frame (sending the last ETag, so unchanged frames cost nothing), and only pushes over BLE when a frame actually changed. BLE uploads happen one tag at a time (Bluetooth is serial), so a change to many tags refreshes them in sequence. Run it under systemd / an init supervisor for an always-on setup, or --once for a single pass (a cron-driven refresh).
Scaling to many tags
- One bridge cycles its tags sequentially. Fine for a wall that updates on an e-paper cadence.
- Multiple bridges, each on its own BLE adapter near its cluster of tags, all point at the same
server_url. That's how you cover more tags or more rooms: shard the tags across bridges by location.
How it fits together
Tesserae server ──HTTP /frame──► bridge (this) ──BLE upload──► OpenDisplay tag
renders polls + pushes displays
Tesserae renders each tag's dashboard as a full-colour PNG (the opendisplay device kind uses the pi_png renderer); the bridge hands that PNG to the OpenDisplay SDK, which does the panel-specific dithering. Nothing about the tag's geometry lives on the server beyond the panel size you register it with.
License
AGPL-3.0-or-later.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tesserae_opendisplay-0.1.0.tar.gz.
File metadata
- Download URL: tesserae_opendisplay-0.1.0.tar.gz
- Upload date:
- Size: 26.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eacbef0999ef77a7baa08435c2372b85719435b30f9baa7bffd38bf79fbc6afb
|
|
| MD5 |
22a863bc9c48d2ccc5fd01e58f2dc922
|
|
| BLAKE2b-256 |
d772be9444fab58e67d57bedc737b490439b5185fc36d5516e1c9d93da48ad92
|
Provenance
The following attestation bundles were made for tesserae_opendisplay-0.1.0.tar.gz:
Publisher:
publish.yml on dmellok/tesserae-opendisplay
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tesserae_opendisplay-0.1.0.tar.gz -
Subject digest:
eacbef0999ef77a7baa08435c2372b85719435b30f9baa7bffd38bf79fbc6afb - Sigstore transparency entry: 2194703672
- Sigstore integration time:
-
Permalink:
dmellok/tesserae-opendisplay@bc5979e0ec9bd62e20a6a1ed87fb743bd03574ac -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/dmellok
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bc5979e0ec9bd62e20a6a1ed87fb743bd03574ac -
Trigger Event:
push
-
Statement type:
File details
Details for the file tesserae_opendisplay-0.1.0-py3-none-any.whl.
File metadata
- Download URL: tesserae_opendisplay-0.1.0-py3-none-any.whl
- Upload date:
- Size: 25.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bb3de448e0457ff814f80a84d1377e7ed35bd381886d5a6136512028d312d4a
|
|
| MD5 |
bd70f611df99d6a93bce73ae3a25eb28
|
|
| BLAKE2b-256 |
640f712176aab629abd724e924c37820b1d94aecd916944dffce4eab1c487c86
|
Provenance
The following attestation bundles were made for tesserae_opendisplay-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on dmellok/tesserae-opendisplay
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tesserae_opendisplay-0.1.0-py3-none-any.whl -
Subject digest:
7bb3de448e0457ff814f80a84d1377e7ed35bd381886d5a6136512028d312d4a - Sigstore transparency entry: 2194703696
- Sigstore integration time:
-
Permalink:
dmellok/tesserae-opendisplay@bc5979e0ec9bd62e20a6a1ed87fb743bd03574ac -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/dmellok
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bc5979e0ec9bd62e20a6a1ed87fb743bd03574ac -
Trigger Event:
push
-
Statement type: