This guide describes how to set up and use the Waveshare E-Paper display with Azazel Edge for real-time status visualization.
The E-Paper display integration provides:
- Real-time status visualization of Azazel Edge's defensive posture
- Mode indication (Portal, Shield, Lockdown) with visual highlighting
- Network status showing interface state and IP address
- Alert counters for recent and total security events
- Service monitoring for Suricata and OpenCanary
- Boot/shutdown animations for system state feedback
- Boot/shutdown animations were removed to improve stability; boot now clears to a clean white screen and shutdown clears then sleeps the display
- Low power consumption with partial update support to reduce flicker
- Waveshare 2.13" E-Paper Display (250×122 pixels)
- Monochrome version:
epd2in13_V4(recommended) - Bicolor version:
epd2in13b_V4 - Older versions:
epd2in13_V3,epd2in13_V2
- Monochrome version:
The display connects to the Raspberry Pi via SPI interface:
| E-Paper Pin | Raspberry Pi Pin | Function |
|---|---|---|
| VCC | 3.3V (Pin 1 or 17) | Power |
| GND | GND (Pin 6, 9, 14, 20, 25, 30, 34, 39) | Ground |
| DIN | GPIO 10 (MOSI, Pin 19) | SPI Data In |
| CLK | GPIO 11 (SCLK, Pin 23) | SPI Clock |
| CS | GPIO 8 (CE0, Pin 24) | Chip Select |
| DC | GPIO 25 (Pin 22) | Data/Command |
| RST | GPIO 17 (Pin 11) | Reset |
| BUSY | GPIO 24 (Pin 18) | Busy Signal |
# Using raspi-config
sudo raspi-config
# Navigate to: Interface Options → SPI → Enable
# Or manually edit config
echo "dtparam=spi=on" | sudo tee -a /boot/config.txt
# Reboot to apply
sudo rebootVerify SPI is enabled:
ls /dev/spidev0.0
# Should exist after rebootE-Paper setup is now integrated into the complete installer. You can prepare the library and service even without the hardware attached.
# Install with E-Paper integration
sudo scripts/install_azazel_complete.sh --enable-epd --start
# If hardware is not connected, enable emulation mode
sudo scripts/install_azazel_complete.sh --enable-epd --epd-emulate --startAfter installation, an env file is placed at /etc/default/azazel-epd. You can pass extra flags via EPD_OPTS (for example to enable emulation):
sudo sed -i '/^EPD_OPTS=/d' /etc/default/azazel-epd
echo 'EPD_OPTS=--emulate' | sudo tee -a /etc/default/azazel-epd
sudo systemctl restart azazel-epd.servicescripts/install_epd.sh is deprecated. Use --enable-epd instead.
The E-Paper service is installed automatically with Azazel Edge, but can be manually installed:
# Copy service file
sudo cp systemd/azazel-epd.service /etc/systemd/system/
# Copy default configuration
sudo cp deploy/azazel-epd.default /etc/default/azazel-epd
# Reload systemd
sudo systemctl daemon-reloadEdit /etc/default/azazel-epd to customize:
# Update interval in seconds (default: 10)
UPDATE_INTERVAL=10
# Path to events.json log file
EVENTS_LOG=/var/log/azazel/events.json
# Enable debug logging (0 or 1)
DEBUG=0If using a different E-Paper model, you may need to adjust the driver:
- Check available drivers in
/opt/waveshare-epd/RaspberryPi_JetsonNano/python/lib/waveshare_epd/ - Edit
azazel_edge/core/display/renderer.pyand update thedriver_nameparameter
# If you used --start, the service may already be enabled
sudo systemctl enable azazel-epd.service
sudo systemctl start azazel-epd.service
sudo systemctl status azazel-epd.serviceTest the display without running the full daemon:
# Test mode: single status update (use --emulate if no hardware)
sudo python3 /opt/azazel/azazel_edge/core/display/epd_daemon.py --mode=test --emulate
# Boot performs a non-animated clear-to-white (no long animation)
sudo python3 /opt/azazel/azazel_edge/core/display/epd_daemon.py --mode=boot
# Shutdown clears the display and puts the hardware to sleep
sudo python3 /opt/azazel/azazel_edge/core/display/epd_daemon.py --mode=shutdown
# Run daemon in foreground with debug output
sudo python3 /opt/azazel/azazel_edge/core/display/epd_daemon.py \
--mode=daemon \
--interval=5 \
--debug# View service logs
sudo journalctl -u azazel-epd.service -f
# View recent activity
sudo journalctl -u azazel-epd.service --since "10 minutes ago"The E-Paper display shows the following information:
╔════════════════════════════════════════════╗
║ Azazel-Edge (inverted) ║
╠════════════════════════════════════════════╣
║ [Mode: SHIELD] Score: 32.5 ║
╟────────────────────────────────────────────╢
║ ● eth0: 192.168.1.100 ║
║ Alerts: 3/47 (5m/total) ║
║ Svc: Suri✓ Canary✓ ║
╟────────────────────────────────────────────╢
║ Up 12h34m | 14:23:45 ║
╚════════════════════════════════════════════╝
- PORTAL: White background (normal operations)
- SHIELD: Black background, white text (heightened monitoring)
- LOCKDOWN: Black background, white text (full containment)
●= Interface up and active○= Interface down or no link✓= Service active✗= Service inactive
-
Check SPI is enabled:
lsmod | grep spi # Should show spi_bcm2835 or similar
-
Verify device exists:
ls -l /dev/spidev0.0 # Should be present -
Check service status:
sudo systemctl status azazel-epd.service
-
Review logs:
sudo journalctl -u azazel-epd.service --no-pager | tail -50
This is normal for E-Paper displays. To mitigate:
-
Full refresh: Disable gentle updates
# Edit /etc/default/azazel-epd # Run daemon with --no-gentle flag
-
Clear display manually:
sudo python3 /opt/azazel/azazel_edge/core/display/epd_daemon.py --mode=shutdown
If you see "E-Paper driver not found":
-
Check library installation:
ls /opt/waveshare-epd/RaspberryPi_JetsonNano/python/lib/waveshare_epd/
-
Verify your display model:
- Check the label on your E-Paper HAT
- Match with available driver files
-
Try alternative driver:
# Edit renderer.py, try different driver name: # epd2in13_V3, epd2in13_V2, epd2in13b_V4, etc.
The E-Paper service runs as root because SPI access requires elevated privileges.
If testing manually, always use sudo:
sudo python3 /opt/azazel/azazel_edge/core/display/epd_daemon.py --mode=testE-Paper updates are CPU-intensive. To reduce load:
-
Increase update interval:
# Edit /etc/default/azazel-epd UPDATE_INTERVAL=30 # Update every 30 seconds instead of 10
-
Use gentle updates (default):
- Partial refresh uses less CPU
- May cause slight ghosting over time
The E-Paper display automatically integrates with:
- State Machine: Shows current mode (portal/shield/lockdown)
- Scorer: Displays moving average of threat score
- Event Logs: Counts alerts from
/var/log/azazel/events.json - Network Status: Monitors primary interface (eth0 by default)
- Service Status: Checks Suricata and OpenCanary via systemd
To monitor a different network interface, modify the status collector:
# Edit azazel_edge/core/display/status_collector.py
# In the collect() method, change:
network=self._get_network_status("wlan0"), # Instead of "eth0"The display renderer can be customized:
# Edit azazel_edge/core/display/renderer.py
# Modify the render_status() method to change layoutTo run multiple displays (e.g., different update intervals):
- Create separate systemd services
- Use different configuration files
- Ensure each uses a unique SPI chip select pin
- Update Time: ~2-3 seconds for full refresh, ~1 second for partial
- Power Consumption: ~15mA active, ~0mA when sleeping
- Refresh Rate: Recommended 10-30 seconds to balance visibility and lifespan
- Display Lifespan: Millions of refreshes (years of continuous use)
E-Paper integration adapted from the Azazel-Zero portable barrier project, which implements similar status display functionality on Raspberry Pi Zero 2 W.