feat: détection erreurs imprimante via IPP direct (Selphy CP1300)
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled

- script_print.sh : après lp, polling CUPS + sondage IPP direct ipp://IP:631/ipp/print
  Détecte input-tray-missing / media-empty en ~3-6s sans attendre le timeout CUPS
- printer_service.py : ajout _get_printer_ip(), _query_ipp_direct()
  _get_printer_status() utilise IPP pour état/raisons/encre (source de vérité)
- Timeout porté à 120s côté Python, fallback lpstat conservé
This commit is contained in:
2026-07-17 17:08:00 +02:00
parent 68b0a36031
commit 8a70dea240
3 changed files with 287 additions and 25 deletions
+36 -4
View File
@@ -136,8 +136,26 @@ if [ -z "$JOB_ID" ]; then
exit 0
fi
# --- Preparation du sondage IPP direct sur l'imprimante ---
# La Selphy CP1300 expose un serveur IPP natif (port 631, sans auth).
# Cela permet de detecter les erreurs physiques en quelques secondes
# sans attendre un timeout CUPS (qui ne rapporte pas les erreurs papier).
PRINTER_IP=$(lpstat -v "$SELECTED_PRINTER" 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -1)
IPP_URI=""
IPP_TEST="/usr/share/cups/ipptool/get-printer-attributes.test"
if [ -n "$PRINTER_IP" ] && command -v ipptool &>/dev/null && [ -f "$IPP_TEST" ]; then
IPP_URI="ipp://${PRINTER_IP}:631/ipp/print"
log_info "Sondage IPP direct actif: $IPP_URI"
else
log_info "Sondage IPP desactive (IP=${PRINTER_IP:-inconnu}, ipptool=$(command -v ipptool || echo absent))"
fi
# Mots-cles d'erreur dans printer-state-reasons
IPP_ERROR_REASONS="input-tray-missing|media-empty|media-needed|marker-supply-empty|cover-open|door-open|offline-report"
# --- Suivi du job CUPS (attend la completion physique) ---
MAX_WAIT=90 # secondes max (Selphy CP1300 ~ 60s)
MAX_WAIT=90 # secondes max (Selphy CP1300 imprime en ~47s)
POLL_INTERVAL=3
elapsed=0
@@ -147,7 +165,7 @@ while [ $elapsed -lt $MAX_WAIT ]; do
sleep $POLL_INTERVAL
elapsed=$((elapsed + POLL_INTERVAL))
# Succes : job dans la liste des jobs termines
# 1. Succes : job dans la liste des jobs termines par CUPS
if lpstat -W completed 2>/dev/null | grep -q "^${JOB_ID} "; then
log_info "Job $JOB_ID termine avec succes (${elapsed}s)"
echo "PRINTED:${SELECTED_PRINTER}:${copies}"
@@ -155,13 +173,27 @@ while [ $elapsed -lt $MAX_WAIT ]; do
exit 0
fi
# Erreur : imprimante stoppee (papier absent, capot ouvert, etc.)
# 2. Sondage IPP direct (detecte papier absent, capot ouvert, etc. en ~3s)
if [ -n "$IPP_URI" ]; then
ipp_reasons=$(ipptool -tv "$IPP_URI" "$IPP_TEST" 2>/dev/null \
| grep "printer-state-reasons" | head -1)
if echo "$ipp_reasons" | grep -qiE "$IPP_ERROR_REASONS"; then
reason=$(echo "$ipp_reasons" | grep -oiE "$IPP_ERROR_REASONS" | head -1)
log_error "Erreur imprimante detectee via IPP: $reason (${elapsed}s)"
cancel "$JOB_ID" 2>/dev/null || true
echo "PRINT_ERROR:${SELECTED_PRINTER}:${reason}"
[ -f "$filename_print" ] && rm -f "$filename_print" 2>/dev/null
exit 1
fi
fi
# 3. Fallback CUPS : imprimante stoppee cote CUPS
printer_state=$(lpstat -p "$SELECTED_PRINTER" 2>/dev/null || true)
if echo "$printer_state" | grep -qiE "stopped|disabled"; then
reason=$(lpstat -l -p "$SELECTED_PRINTER" 2>/dev/null \
| grep -i "Reason:" | head -1 \
| sed 's/.*Reason:[[:space:]]*//' | xargs)
log_error "Imprimante $SELECTED_PRINTER en erreur: ${reason:-stopped} (apres ${elapsed}s)"
log_error "Imprimante $SELECTED_PRINTER stoppee (CUPS): ${reason:-stopped} (${elapsed}s)"
cancel "$JOB_ID" 2>/dev/null || true
echo "PRINT_ERROR:${SELECTED_PRINTER}:${reason:-stopped}"
[ -f "$filename_print" ] && rm -f "$filename_print" 2>/dev/null