Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tesserae_opendisplay-0.1.0.tar.gz (26.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tesserae_opendisplay-0.1.0-py3-none-any.whl (25.2 kB view details)

Uploaded Python 3

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

Hashes for tesserae_opendisplay-0.1.0.tar.gz
Algorithm Hash digest
SHA256 eacbef0999ef77a7baa08435c2372b85719435b30f9baa7bffd38bf79fbc6afb
MD5 22a863bc9c48d2ccc5fd01e58f2dc922
BLAKE2b-256 d772be9444fab58e67d57bedc737b490439b5185fc36d5516e1c9d93da48ad92

See more details on using hashes here.

Provenance

The following attestation bundles were made for tesserae_opendisplay-0.1.0.tar.gz:

Publisher: publish.yml on dmellok/tesserae-opendisplay

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tesserae_opendisplay-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for tesserae_opendisplay-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7bb3de448e0457ff814f80a84d1377e7ed35bd381886d5a6136512028d312d4a
MD5 bd70f611df99d6a93bce73ae3a25eb28
BLAKE2b-256 640f712176aab629abd724e924c37820b1d94aecd916944dffce4eab1c487c86

See more details on using hashes here.

Provenance

The following attestation bundles were made for tesserae_opendisplay-0.1.0-py3-none-any.whl:

Publisher: publish.yml on dmellok/tesserae-opendisplay

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page