Cosa mi interessa sapere di una stampante
Di una stampante di rete mi interessano due cose: se è raggiungibile e in che stato, e quanto manca perché finisca qualcosa. Con la prima risponde un'integrazione ufficiale. Per la seconda ho dovuto fare un passo in più, perché l'integrazione mostra le cartucce ma non tutti i materiali di consumo di una stampante laser.
Lo stato: l'integrazione IPP
IPP è il protocollo di stampa in rete (Internet Printing Protocol). L'integrazione IPP di Home Assistant si aggiunge da Impostazioni, Dispositivi e servizi, con l'indirizzo IP riservato della stampante, la porta 631 e il percorso ipp/print. Crea le entità di stato e di tempo di accensione e, se la stampante le espone, una per ogni cartuccia.
Molte stampanti in stand-by non rispondono e le entità diventano «sconosciute». Per questo non ho un avviso «stampante non raggiungibile»: ho solo quello dei materiali di consumo.
I materiali di consumo: SNMP con un container usa e getta
Le stampanti laser espongono toner, tamburo, fusore e rulli tramite SNMP, con uno standard chiamato Printer MIB (RFC 3805). Per leggerli serve uno strumento snmpwalk. Non volevo installarlo in modo permanente sul mini PC, quindi lo script lancia un container Docker «usa e getta» (goatatwork/snmpwalk, pochi MB): parte, fa la lettura, sparisce. Nessuna modifica alla stampante, nessuna installazione sul PC.
Lo script PowerShell interroga la tabella dei materiali (1.3.6.1.2.1.43.11.1.1), tiene solo quelli della classe «materiale consumabile» e per ognuno calcola la percentuale dal livello e dal livello massimo. Il risultato è un file JSON con nome, tipo (toner, tamburo, fusore, componente) e percentuale.
# tipo SNMP (Printer MIB, RFC 3805) -> descrizione in italiano
$Tipi = @{ 3 = 'Toner'; 9 = 'Tamburo (unita fotoconduttrice)'; 15 = 'Fusore'; 4 = 'Toner di scarto' }
$raw = (docker run --rm goatatwork/snmpwalk -v 1 -c $Community $Ip 1.3.6.1.2.1.43.11.1.1 2>&1) -join "`n"
if ($raw -notmatch '43\.11\.1\.1\.') { throw "La stampante non ha risposto via SNMP (community '$Community')." }
# per ogni riga: nome, tipo, livello massimo e livello attuale
$pct = $(if ($max -gt 0) { [math]::Round(($liv / $max) * 100, 1) } else { $null })
La community è la «password» di lettura di SNMP: nel mio script uso il valore predefinito di lettura, che su una rete di casa va benissimo purché la stampante non sia raggiungibile da fuori. Se ne hai impostata un'altra sulla tua stampante, indicala.
Lo script è una piccola attività pianificata che gira ogni ora e scrive il file in config/logs. Home Assistant lo legge ogni cinque minuti con un sensore command_line, che contiene l'elenco dei componenti, e da lì nascono un sensore e un indicatore per ciascuno dei sette componenti che la mia stampante espone.
L'avviso: prima che finiscano
L'installatore crea un avviso per il componente più consumato quando scende sotto una soglia. La soglia predefinita è il 15% e si cambia con il parametro -Soglia. Due regole evitano il rumore:
- la condizione deve durare 10 minuti, per ignorare letture sbagliate;
- al massimo un avviso a settimana (
last_triggeredsupera 604800 secondi).
Il canale si sceglie dal menu «Inchiostro in esaurimento» della scheda «Messaggi» (ne parlo nella guida sui messaggi). L'avviso può anche aggiungere da solo una riga «Cartuccia ...» alla lista della spesa di Google Keep, senza doppioni: è il pezzo che collega questa guida alla lista della spesa.
La scheda «Casa»
- Stampante: lo stato e il tempo di attività.
- Informazioni stampante: un riquadro con le informazioni della stampante.
- Materiali di consumo: la tabella completa con un indicatore per ciascuno: toner nero, tamburo (unità fotoconduttrice), rullo di trasferimento, fusore, rullo di prelievo e i rulli del cassetto 1 (ritardo e avanzamento).
I nomi dei componenti sono scritti in italiano, con un elenco di coppie indice e nome. In una prima versione i nomi erano sfasati di una posizione (mancava il toner nero): ho riscritto l'abbinamento e fatto rileggere il file appena scritto per verificarlo a video.