Home Assistant Integration for the OpenEPaperLink project, enabling control and monitoring of electronic shelf labels (ESLs) through Home Assistant.
AP-Based Setup:
- OpenEPaperLink Access Point (ESP32-based)
- Compatible Electronic Shelf Labels connected to AP
BLE-Based Setup:
- BLE-compatible Electronic Shelf Labels with ATC BLE firmware
- Home Assistant with Bluetooth adapter or proxy (e.g., ESPHome)
- No separate AP required - direct device communication
Mixed Setup:
- Both AP and BLE devices can coexist in the same Home Assistant instance
- Each tag and AP appears as a device in Home Assistant
- Device triggers for buttons, NFC, and GPIO
- Automatic tag discovery and configuration
- AP settings management (WiFi, Bluetooth, language, etc.)
- Tag inventory and blacklist management
The most flexible and powerful service for creating custom displays. Supports:
- Text with multiple fonts and styles
- Shapes (rectangles, circles, lines)
- Icons from Material Design Icons
- QR codes
- Images from URLs
- Plots of Home Assistant sensor data
- Progress bars
View full drawcustom documentation
The following services have been deprecated in favor of drawcustom:
- dlimg: Download and display images from URLs
- lines5: Display 5 lines of text (1.54" displays only)
- lines4: Display 4 lines of text (2.9" displays only)
These legacy services were removed in the 1.0 release. Please migrate to using drawcustom.
clear_pending: Clear pending updatesforce_refresh: Force display refreshreboot_tag: Reboot tagscan_channels: Initiate channel scanreboot_ap: Reboot the access point- Automatic tag detection and configuration
- Support for tag blacklisting to ignore unwanted devices
- Hardware capability detection for buttons, NFC, and GPIO features
To maximize tag battery life when using this integration:
-
Shorten latency during config setting: This setting can be set to
noeither directly on the AP's web interface or through the integration's AP device in Home Assistant.If set to
yes, tags will only sleep for 40 seconds between check-ins instead of using the configured longer sleep periods, reducing battery life.This occurs because Home Assistant maintains a constant WebSocket connection to the AP, which the AP interprets as being in configuration mode.
For the integration to discover and control BLE-based e-paper tags, they MUST be running the correct firmware and be properly configured. Tags with their original stock firmware will not be discovered by Home Assistant.
The flashing method depends on the tag model:
- For tags previously used with an OpenEPaperLink BLE AP: The web-based OTA flasher can likely be used.
- For other tags: A manual flash is often required. This video provides a comprehensive guide: Universal E-Paper Firmware Flashing.
After flashing, the correct device type for the tag model must be set.
- Connect to the tag using the ATC_BLE_OEPL Image Upload tool.
- Use the "Set Type" dropdown to select the specific tag model (e.g., "
12: 290 Gici BWR SSD"). - Click the "Set Type" button.
For any issues, the #atc_ble_oepl and #home_assistant channel on the OpenEPaperLink Discord is a great resource for community support.
Once flashed and configured, tags are discovered by HA automatically.
- Download the
open_epaper_linkfolder from the latest release - Copy it to your
custom_componentsfolder - Restart Home Assistant
This step is only needed when using OpenEPaperLink in AP mode. When using a BLE-only setup, the tags will be detected automatically as soon as OpenEPaperLink has been installed.
Add OpenEPaperLink to your Home Assistant instance using this button:
- Browse to your Home Assistant instance
- Go to Settings → Devices & Services
- Click the
Add Integrationbutton in the bottom right - Search for and select "OpenEPaperLink"
- Follow the on-screen instructions
After setup, you can configure additional options through the integration's option flow:
- Blacklisted Tags: Select tags to hide and ignore.
- Button Debounce Time: Adjust sensitivity of button triggers (0.0-5.0 seconds)
- NFC Debounce Time: Adjust sensitivity of NFC triggers (0.0-5.0 seconds)
AP Device Configuration:
- Automatic Discovery (recommended): APs are automatically discovered via DHCP when connected to the network
- Manual Setup (fallback): Go to Settings → Integrations → Add Integration and enter your AP's IP address
⚠️ Single Hub Limitation: Only one AP hub allowed per Home Assistant instance- All tags connected to the AP are automatically discovered
BLE Device Discovery:
- Automatic discovery via Bluetooth scanning
- Devices appear when in range and advertising
- Each BLE device creates a separate integration entry
- No limit on number of BLE devices
- type: "text"
value: "Hello World!"
x: 10
y: 10
size: 40
color: "red"- type: "progress_bar"
x_start: 10
y_start: 10
x_end: 180
y_end: 30
progress: 75
fill: "red"
show_percentage: true
- type: "icon"
value: "mdi:battery-70"
x: 190
y: 20
size: 24- type: "text"
value: "Temperature: {{ states('sensor.temperature') }}°C"
x: 10
y: 10
size: 24
color: "black"
- type: "text"
value: "Humidity: {{ states('sensor.humidity') }}%"
x: 10
y: 40
size: 24
color: "black"- Service Changes
dlimg,lines4, andlines5services have been deprecated- All image/text display should now use
drawcustomservice - Service target now uses device ID instead of entity ID
- Entity Changes
- Entities for each device have also changed significantly
To make sure no potential bugs carry over from the old version, please remove the old integration and re-add it. This will ensure that all entities are correctly setup.
Old format (lines5 service):
line1: "Hello"
line2: "World"New format (drawcustom payload):
- type: "text"
value: "Hello"
x: 10
y: 10
size: 24
- type: "text"
value: "World"
x: 10
y: 40
size: 24Old format (dlimg service):
url: "https://example.com/image.jpg"
x: 0
y: 0
xsize: 296
ysize: 128New format (drawcustom payload):
- type: "dlimg"
url: "https://example.com/image.jpg"
x: 0
y: 0
xsize: 296
ysize: 128The device selection, background color, rotation, and other options are now configured through dropdown menus in the service UI.
- Feature requests and bug reports are welcome! Please open an issue on GitHub
- Pull requests are encouraged
- Join the Discord server to discuss ideas and get help
