Un afficheur de notifications sur e-ink pour Raspberry Pi + écran Waveshare 2.13" e-Paper HAT (V2). N'importe lequel de tes projets lui envoie une notif — par HTTP ou via ntfy — et elle s'affiche à l'écran. Livré avec un petit dashboard web (aperçu live, envoi de test, réglage des topics) et un kit de flash qui prépare une carte SD prête à booter (Wi-Fi + Tailscale + auto-install).
Réutilisable par tous tes projets : ARGUS (surveillance) pousse déjà en ntfy → abonne l'afficheur au même topic, ses alertes s'affichent toutes seules. Tout projet qui publie sur ntfy ou fait un
POST /notifyapparaît pareil.
Rendu (250×122, N&B) — icône choisie selon le contexte, filet titre/corps, badge « +N » sur les rafales :
┌───────────────────────────────────────────┐
│ ⌂ ARGUS 20:34 │ bandeau : icône · source · heure
│ Personne détectée │ titre (gras)
│ ───────────────────────────────────────── │
│ Caméra Entrée — visage inconnu. [+2] │ corps · +N si coalescé
└───────────────────────────────────────────┘
- Raspberry Pi (testé : Pi 4) sous Raspberry Pi OS (Bookworm).
- Waveshare 2.13" e-Paper HAT, Rev2.1 / V2 sur le GPIO 40 broches, cavalier BS = 0.
Depuis un Mac, tu prépares une carte qui, au premier boot, rejoint le Wi-Fi, (optionnel) Tailscale, active le SPI et s'installe toute seule — façon Raspberry Pi Imager, en plus complet.
cp flash.conf.example flash.conf # remplis Wi-Fi, compte, topic ntfy, (Tailscale)
./flash.sh prepare # carte DÉJÀ flashée Pi OS Lite → on la configure (sûr)
# ou, tout automatique (destructif, verrouillé) :
./flash.sh burn disk4 # télécharge Pi OS Lite + écrit sur disk4 + configureprepare ne touche à aucun disque (il configure la partition de boot déjà montée).
burn refuse tout disque interne/partition et exige de taper ERASE diskN.
Ensuite : carte dans le Pi, e-paper branché, on allume. 1er boot = Wi-Fi + compte +
SPI ; 2e boot = install + démarrage. (Bookworm requis pour le mode burn.)
bash install.sh # SPI + deps + lib Waveshare + service systemd
nano config.json # ntfy_topics: ["ton-topic"]
sudo systemctl restart epaper-notifier
journalctl -u epaper-notifier -fSur http://<ip-ou-hostname-du-pi>:4800/ :
- aperçu live (miroir exact de l'écran e-ink),
- envoi d'une notif de test (source, titre, message),
- édition des topics ntfy à chaud (réabonnement sans redémarrage) + libellé source.
Endpoints : GET /api/status, GET /preview.png, POST /notify, POST /config.
HTTP (n'importe quel projet, n'importe quel langage) :
curl -X POST http://<pi>:4800/notify -H 'Content-Type: application/json' \
-d '{"source":"MonApp","title":"Build terminé","body":"Déploiement OK en 42 s."}'Champs : title, body/text, source, icon (bell/alert/camera/sound/check/
person/shield/info) — tous optionnels ; l'icône est sinon devinée du texte.
ntfy (publie sur un topic suivi) :
curl -d "Sauvegarde terminée" ntfy.sh/ton-topic-ntfyARGUS envoie déjà ses alertes en ntfy. Mets le même topic que dans ses Réglages → chaque événement (mouvement, personne, bruit…) s'affiche sur l'e-paper.
Renseigne TAILSCALE_AUTHKEY dans flash.conf (clé générée sur
login.tailscale.com, Reusable
- Pre-approved) : le Pi rejoint ton tailnet au premier boot. Depuis ton tel
(Tailscale connecté), le dashboard et
POST /notifysont joignables de partout viahttp://<hostname>:4800/. (Déjà installé ?install.shla lit dans.ts_authkeyou$TAILSCALE_AUTHKEY.)
| clé | rôle |
|---|---|
http_port |
port du dashboard + /notify (défaut 4800) |
ntfy_server / ntfy_topics |
serveur + topics ntfy suivis |
model |
panneau : epd2in13_V2 (défaut), _V3 ou _V4 selon ta carte |
rotate |
0 ou 180 |
min_interval |
secondes mini entre 2 rafraîchis (protège l'e-ink lent) |
source_default |
libellé « source » par défaut |
display.py sait dessiner sans e-paper : sur Mac/PC il écrit preview.png.
Pratique pour régler la mise en page. Le service écrit toujours ce PNG (même sur
le Pi) → c'est lui que le dashboard affiche.
python3 display.py # -> preview.png| Souci | Piste |
|---|---|
| Écran vide sur le Pi mais service OK | mauvais model : le driver V2 exige init(FULL_UPDATE) (déjà géré) — si ta carte est V3/V4, mets epd2in13_V3/_V4 dans config.json |
| Rien ne s'affiche du tout | SPI pas activé (sudo raspi-config → Interfaces → SPI) ; cavalier BS=0 |
| Image à l'envers | rotate: 180 |
burn refuse le disque |
donne un disque entier externe (diskN, pas diskNsM) |
| macOS : hash mot de passe | l'openssl d'Apple (LibreSSL) ne fait pas -6 : brew install openssl@3 |
| ntfy ne remonte rien | vérifie ntfy_topics + que le projet publie sur CE topic/serveur |
epaper-notifier/
├── notifier.py service : dashboard web + HTTP /notify + abonnement ntfy
├── display.py rendu e-ink 1-bit (icônes, états) + repli PNG hors Pi
├── dashboard.html page web (aperçu live, test, topics)
├── config.example.json modèle de config
├── install.sh SPI + deps + lib Waveshare + service (+ Tailscale)
├── send-test.sh POST une notif de test
├── flash.conf.example réglages du flash (Wi-Fi, compte, ntfy, Tailscale)
├── flash.sh prépare la carte SD (modes prepare / burn)
└── flash/firstrun.sh exécuté au 1er boot (Wi-Fi, compte, SPI, déploiement)
MIT © 2026 Sébastien SCHNABEL — AVEXTD Maroc. Non affilié à Waveshare / Tailscale / ntfy.