Intégration du Scanner Epson ET4856 Scanner Epson ET-4856 — Intégration Home Assistant & Paperless-ngx   1. Vue d'ensemble L'imprimante Epson ET-4856 (identifiée comme ET-4850 Series) est pilotée en local via le protocole eSCL (AirScan/AirPrint) en HTTPS. Un script bash exécuté depuis le container Home Assistant déclenche les scans et dépose les fichiers directement dans le répertoire consume de Paperless-ngx pour ingestion automatique (OCR + indexation). Architecture Bouton Dashboard HA → script.scanner_epson → shell_command.epson_scan → POST eSCL /ScanJobs (HTTPS:443) sur l'imprimante → GET /NextDocument → fichier PDF → /media/scans/ (= consume Paperless-ngx) → Paperless ingère → OCR → indexation → archivage Composants impliqués Composant Rôle Emplacement Epson ET-4856 Scanner (eSCL via HTTPS) 192.168.10.25:443 Home Assistant Orchestration, dashboard, déclenchement Container Docker sur Unraid Paperless-ngx Ingestion, OCR, indexation Container Docker sur Unraid epson_scan.sh Script bash de scan eSCL /config/scripts/epson_scan.sh 2. Protocole eSCL — Détails techniques Découverte Le scanner n'expose pas eSCL en HTTP (port 80). Il faut utiliser HTTPS sur le port 443 avec -k (certificat auto-signé SEIKO EPSON CORP.). # Vérifier le statut du scanner curl -s -k https://192.168.10.25/eSCL/ScannerStatus # Voir les capabilities curl -s -k https://192.168.10.25/eSCL/ScannerCapabilities Capabilities du scanner Paramètre Vitre (Platen) Chargeur (ADF) Résolutions 100, 200, 300, 600, 1200 DPI 100, 200, 300, 600 DPI Modes couleur RGB24, Grayscale8, BlackAndWhite1 RGB24, Grayscale8, BlackAndWhite1 Formats sortie PDF, JPEG PDF, JPEG Duplex N/A Non supporté (SimplexInputCaps uniquement) Capacité 1 page 50 feuilles max Dimensions max 2550 x 3510 (≈A4) 2550 x 4200 Workflow eSCL (séquence HTTP) POST /eSCL/ScanJobs avec XML de paramètres → Réponse 201 + header Location contenant l'URL du job GET {Location}/NextDocument → Télécharge le fichier scanné (PDF ou JPEG) GET {Location}/NextDocument (2ème appel) → Renvoie 404, signale la fin au scanner DELETE {Location} → Libère le job et remet le scanner en Idle ⚠️ Important : Sans les étapes 3 et 4, le scanner reste bloqué en "Scan en cours" sur l'écran LCD. Exemple de XML ScanSettings 2.0 2550 3510 escl:ThreeHundredthsOfInches 0 0 Platen RGB24 300 300 application/pdf Document 3. Configuration du container Home Assistant Volume monté Le répertoire consume de Paperless est monté dans le container HA : -v '/mnt/user/Sauvegarde_Jean-Michel/Documents_Importants/consume/':'/media/scans':'rw' Dépendance : poppler-utils Le package poppler-utils (fournit pdfunite ) est nécessaire pour la fusion PDF multi-pages ADF. Comme le container HA est basé sur Alpine Linux (BusyBox), le package est perdu à chaque redémarrage. Solution : Un script d'installation + une automation HA au démarrage. Fichier : /config/scripts/install_deps.sh #!/bin/bash apk add --no-cache poppler-utils 2>/dev/null Automation : dans automations.yaml - alias: "Install scanner dependencies" trigger: - trigger: homeassistant event: start action: - action: shell_command.install_deps 4. Script epson_scan.sh (v2) Emplacement /config/scripts/epson_scan.sh (dans le container HA) /mnt/user/appdata/homeassistant/scripts/epson_scan.sh (côté Unraid) Paramètres Position Paramètre Valeurs possibles Défaut $1 Résolution 100, 200, 300, 600 300 $2 Source Platen, Feeder Platen $3 Mode couleur RGB24, Grayscale8, BlackAndWhite1 RGB24 $4 Format pdf, jpeg pdf $5 Intent Document, Photo, TextAndGraphic Document $6 Nom document Texte libre (optionnel) scan_[date] Comportement Mode Vitre (Platen) : Scanne 1 page, enregistre directement dans /media/scans/ Mode ADF (Feeder) : Boucle de scan page par page jusqu'à ce que le chargeur soit vide, puis fusionne tous les PDF en un seul via pdfunite . Maximum 50 pages par sécurité. Codes de retour Succès : OK:/chemin/fichier.pdf:taille:N pages (exit 0) Erreur : ERREUR: description (exit 1) Compatibilité BusyBox Le container HA utilise Alpine Linux avec BusyBox. Le script évite : grep -P (Perl regex) → remplacé par sed -n 's/.../p' stat → remplacé par wc -c heredoc cat << EOF pour le XML → chaîne dans une variable Test en ligne de commande # Scan vitre, 200 DPI, couleur, PDF docker exec homeassistant bash /config/scripts/epson_scan.sh 200 Platen RGB24 pdf Document # Scan ADF multi-pages, 300 DPI, niveaux de gris, PDF docker exec homeassistant bash /config/scripts/epson_scan.sh 300 Feeder Grayscale8 pdf Document 5. Configuration Home Assistant configuration.yaml — Sections ajoutées Input selects (options de scan) input_select: scan_source: name: Source de scan options: - "Vitre" - "Chargeur (ADF)" initial: "Vitre" icon: mdi:scanner scan_resolution: name: Résolution options: - "100" - "200" - "300" - "600" initial: "300" icon: mdi:resize scan_color: name: Mode couleur options: - "Couleur" - "Niveaux de gris" - "Noir et blanc" initial: "Couleur" icon: mdi:palette scan_format: name: Format de sortie options: - "PDF" - "JPEG" initial: "PDF" icon: mdi:file-document Input boolean (indicateur scan en cours) input_boolean: scan_en_cours: name: Scan en cours icon: mdi:progress-clock Shell commands shell_command: epson_scan: "bash /config/scripts/epson_scan.sh {{ states('input_select.scan_resolution') }} {{ 'Feeder' if states('input_select.scan_source') == 'Chargeur (ADF)' else 'Platen' }} {{ {'Couleur':'RGB24','Niveaux de gris':'Grayscale8','Noir et blanc':'BlackAndWhite1'}[states('input_select.scan_color')] }} {{ states('input_select.scan_format') | lower }} Document" install_deps: "bash /config/scripts/install_deps.sh" Command line sensors (statut scanner) command_line: - sensor: name: "Epson Scanner Status" unique_id: epson_et4856_scanner_status icon: mdi:scanner command: "curl -s -k https://192.168.10.25/eSCL/ScannerStatus 2>/dev/null" scan_interval: 30 value_template: > {% set matches = value | regex_findall('(.*?)') %} {% if matches %} {% set map = {'Idle':'Prêt','Processing':'En cours','Testing':'Test','Stopped':'Arrêté'} %} {{ map.get(matches[0], matches[0]) }} {% else %} Indisponible {% endif %} - sensor: name: "Epson ADF Status" unique_id: epson_et4856_adf_status icon: mdi:tray-full command: "curl -s -k https://192.168.10.25/eSCL/ScannerStatus 2>/dev/null" scan_interval: 30 value_template: > {% set matches = value | regex_findall('(.*?)') %} {% if matches %} {% set map = {'ScannerAdfEmpty':'Vide','ScannerAdfLoaded':'Papier chargé','ScannerAdfJam':'Bourrage'} %} {{ map.get(matches[0], matches[0]) }} {% else %} Indisponible {% endif %} Note : On utilise command_line sensor au lieu de rest sensor car le client HTTP Python de HA gère mal le certificat auto-signé de l'imprimante malgré verify_ssl: false . scripts.yaml — Script scanner scanner_epson: alias: "Scanner un document" icon: mdi:scanner mode: single sequence: - action: input_boolean.turn_on target: entity_id: input_boolean.scan_en_cours - action: shell_command.epson_scan response_variable: scan_result - action: input_boolean.turn_off target: entity_id: input_boolean.scan_en_cours - choose: - conditions: - condition: template value_template: "{{ scan_result.returncode == 0 }}" sequence: - action: persistent_notification.create data: title: "Scan terminé" message: > Document scanné avec succès ! {{ scan_result.stdout }} notification_id: scan_result - conditions: - condition: template value_template: "{{ scan_result.returncode != 0 }}" sequence: - action: persistent_notification.create data: title: "Erreur de scan" message: > Erreur lors du scan : {{ scan_result.stderr }} notification_id: scan_result 6. Dashboard L'onglet Scan se trouve dans le dashboard lovelace.dashboard_roborock . Il utilise les cards Mushroom (mushroom-template-card, mushroom-select-card) et state-switch pour la cohérence visuelle avec le reste du dashboard. Entités utilisées dans le dashboard Entité Rôle sensor.epson_scanner_status État du scanner (Prêt / En cours) sensor.epson_adf_status État du chargeur ADF (Vide / Papier chargé) input_select.scan_source Choix Vitre / Chargeur ADF input_select.scan_resolution Choix résolution DPI input_select.scan_color Choix couleur / gris / N&B input_select.scan_format Choix PDF / JPEG input_boolean.scan_en_cours Indicateur scan en cours script.scanner_epson Script déclenché par le bouton 7. Dépannage Le scanner répond HTTP 503 Un job précédent est resté bloqué. Vérifier le statut et attendre que le scanner passe en Idle , ou éteindre/rallumer l'imprimante : docker exec homeassistant curl -s -k https://192.168.10.25/eSCL/ScannerStatus Le scanner reste bloqué sur "Scan en cours" (écran LCD) Le job n'a pas été fermé proprement. Le script v2 inclut la fermeture (GET NextDocument + DELETE), mais si un scan a été interrompu : # Récupérer l'UUID du job en cours docker exec homeassistant curl -s -k https://192.168.10.25/eSCL/ScannerStatus # Supprimer le job manuellement (remplacer UUID) docker exec homeassistant curl -s -k -X DELETE "https://192.168.10.25/eSCL/ScanJobs/UUID-DU-JOB" pdfunite not found Le package poppler-utils n'a pas été installé au démarrage. Installer manuellement : docker exec homeassistant apk add --no-cache poppler-utils Vérifier que l'automation "Install scanner dependencies" est active et sans erreur. grep: unrecognized option: P Le script utilise grep -P (Perl regex) incompatible avec BusyBox. Vérifier que le script v2 est bien déployé (utilise sed à la place). docker exec homeassistant head -5 /config/scripts/epson_scan.sh # Doit afficher "v2" Sensor scanner "Indisponible" ou "unavailable" Vérifier que curl fonctionne depuis le container : docker exec homeassistant curl -s -k https://192.168.10.25/eSCL/ScannerStatus Si ça répond du XML mais le sensor ne fonctionne pas, vérifier les logs : docker exec homeassistant grep -i "command_line\|epson" /config/home-assistant.log | tail -10 Timeout sur scan ADF multi-pages Le shell_command de HA a un timeout de 60 secondes . En 300 DPI, chaque page prend ~10-15 secondes. Au-delà de ~4 pages, le timeout peut être atteint. Solutions : Réduire la résolution (200 DPI) Passer en mode asynchrone (script en background + notification webhook) 8. Fichiers — Récapitulatif Fichier (Unraid) Fichier (container HA) Rôle /mnt/user/appdata/homeassistant/scripts/epson_scan.sh /config/scripts/epson_scan.sh Script de scan eSCL v2 /mnt/user/appdata/homeassistant/scripts/install_deps.sh /config/scripts/install_deps.sh Installation poppler-utils au démarrage /mnt/user/appdata/homeassistant/configuration.yaml /config/configuration.yaml Config HA (input_select, shell_command, sensors) /mnt/user/appdata/homeassistant/scripts.yaml /config/scripts.yaml Script HA scanner_epson /mnt/user/appdata/homeassistant/automations.yaml /config/automations.yaml Automation install_deps au démarrage /mnt/user/Sauvegarde_Jean-Michel/Documents_Importants/consume/ /media/scans/ Répertoire de sortie (= consume Paperless) 9. Améliorations possibles Trigger Telegram : Déclencher un scan via commande Telegram bot Bouton Zigbee physique : Bouton à côté de l'imprimante pour scanner en un appui Nommage depuis le dashboard : Ajouter un champ input_text éditable (non résolu — incompatibilité avec les vues sections) Mode asynchrone : Pour les gros lots ADF, lancer le script en background et notifier via webhook quand c'est terminé Niveaux d'encre : Intégration HACS ha-epson-workforce — vérifier http://192.168.10.25/PRESENTATION/HTML/TOP/PRTINFO.HTML Duplex manuel : Workflow en 2 passes (recto puis verso) avec interleaving des pages