Al momento stai visualizzando Uno sterilizzatore UV smart fai da te

Uno sterilizzatore UV smart fai da te

In questo articolo realizzeremo in modo molto semplice e veloce un capiente sterilizzatore UV smart con pochi elementi acquistabili su Amazon, Shelly e un negozio di ferramenta o bricolage.

Durante la pandemia Covid-19, complice la carenza di mascherine e il conseguente innalzamento di costo, abbiamo tutti tentato di riutilizzare più volte le stesse mascherine. Visto il depositarsi di germi e batteri (non solo Covid-19!) tra le fibre non è possibile utilizzarle più di un giorno senza eliminare tali microorganismi. In quel periodo sono apparsi infatti diversi metodi per disinfettare le mascherine più o meno efficaci (ricordo ad esempio i vapori di alcool, il lavaggio in lavatrice, ecc).
Di tutti i metodi apparsi un fattore mi lasciava molto perplesso: tutti i metodi prevedevano un decadimento fisico delle fibre di cui è composta la mascherina, rischiando di renderle più che inutili: dannose!

Quando Shelly ha rilasciato la sua strip di led UVC ho pensato “ecco la soluzione”. I raggi UV-C!
Utilizzando tali raggi, infatti, non avviene alcun decadimento (se non a lungo termine) delle fibre di cui è composta la mascherina in quanto non vi è alcuna azione meccanica o chimica. La strip di Shelly dà un grado del 95% di effettiva uccisione di virus e batteri nel raggio di 2 metri (la nostra scatola sarà molto più piccola! 😉 ).

Così è nato questo progetto che tutti i giorni mi aiuta a risparmiare sulle mascherine ed è perfettamente integrato con il mio sistema di domotica Home Assistant ed Alexa tanto da essere molto apprezzato anche da mia moglie.

Se sei alle prime armi con Home Assistant potrebbe essere anche interessante capire come realizzare le semplici automazioni per la sua gestione, è una buona occasione per imparare diversi concetti con un po’ di pratica 🙂

Ti interessa? Segui le semplici istruzioni di seguito e avrai a breve il tuo sterilizzatore UV smart! 🙂

DISCLAIMER Non sono un dottore, un microbiologo, un nanopatologo o un virologo. Sono una persona, tuttavia, di indole tecnico-analitica che si documenta abbastanza a fondo e fa le cose in modo ragionato, anche per via del mio lavoro. Non posso (e non ho i mezzi) per garantire quindi il risultato di abbattimento microbiologico promesso da Shelly se non la fiducia in Allterco Robotics che li produce.
DISCLAIMER 2: Per realizzare questo sterilizzatore UV smart dovrai collegare dei cavi a 230V, niente di complicato ma fallo solo se ti senti in grado e puoi garantire la tua e altrui sicurezza facendo un lavoro a regola d’arte e sempre con tensione non collegata.

Come sarà il nostro sterilizzatore UV smart esattamente?

Il nostro sterilizzatore UV smart avrà le seguenti caratteristiche:

  • Interno del contenitore riflettente per massimizzare il raggiungimento dei raggi UV da tutte le direzioni
  • Capiente con ganci per fissare fino a quattro mascherine contemporaneamente
  • Accensione e spegnimento smart
  • Sensore apertura porta per interrompere i raggi UV (dannosi per le persone) all’apertura del coperchio
  • Integrazione con Home Assistant
  • Integrazione con Alexa. Partenza del ciclo di sterilizzazione con il comando “Alexa, sterilizza mascherine”, annuncio di termine sterilizzazione e in caso di apertura e richiusura porta durante il funzionamento.

Realizzazione dello sterilizzatore UV smart

Prima di pensare all’hardware da usare e a come integrarlo in Home Assistant dobbiamo realizzare lo sterilizzatore e come prima cosa dobbiamo procurarci il materiale necessario. Non ti preoccupare, sembrano tante cose ma è tutto molto semplice.

Il materiale necessario

Di seguito l’elenco dei materiali necessari alla realizzazione dello sterilizzatore UV smart. Alcune cose possono essere fatte in modo differente per cui questa è una guida di massima di come l’ho fatto io, se avete idee differenti mettetele in pratica!

I prezzi sono rilevati alla data di prima scrittura di questo articolo, potrebbero essere leggermente cambiati.
La realizzazione può essere fatta in molteplici modalità alternative, usando soluzioni hardware anche migliori (come integrare un input per il contatto direttamente sullo Shelly usando il firmware ESPHOME per spegnere i led UV senza passare da Home Assistant o realizzare la propria scheda basata su ESP8266). Io ho optato per uno Shelly 1 e un Aqara Door & Window perchè volevo fosse pronto SUBITO. Se hai tempo puoi dedicarlo a migliorare il progetto 🙂

Realizziamo lo sterilizzatore UV smart

La scatola acquistata su Amazon per costruire il nostro sterilizzatore UV smart

Come prima cosa prendi la scatola di legno e stendi uno strato di alluminio su tutti i lati interni dello stesso, cercando di lasciare l’alluminio il più possibile liscio e non increspato. In questo modo massimizzerai la riflessione dei raggi UV cercando di non disperderli. Attenzione anche a non sporcare di colla il lato visibile dell’alluminio, per non ridurne il potere riflettente.
Non è un lavoro simpatico. Consiglio di disporre tante striscioline sul fondo di Bostik (non spesse!) e di schiacciare bene l’alluminio per farlo aderire al meglio. Al termine rifila l’alluminio in eccesso dal bordo.
L’odore di colla perdurerà per diversi giorni. I primi giorni conviene conservarlo in un ambiente ventilato in cui non si soggiorna a lungo.

Perchè l’alluminio? Sembra che gli specchi non siano idonei a riflettere i raggi UV. Invece tutte le lampade UV per terrari hanno le parabole riflettenti di alluminio…

Posiziona a questo punto la chiusura magnetica per porte come in figura:

Chiusura magnetica fissata all'interno dello sterilizzatore UV smart

Dall’altra parte, sullo sportello che si apre, ho fissato una L di metallo che avevo in giro (occhio che sia attirata dalla calamita!), così che fosse fissabile lateralmente, come in figura:

"L" metallica fissata sull'interno del coperchio, così che sia attirata dalla calamita di cui sopra

Avrai notato che aprendo la scatola le cerniere fanno molta leva per sostenere il peso del coperchio. Il legno in quella zona non durerà a lungo senza un aiuto. Ecco il perchè delle catenelle che ne limitano l’apertura a poco meno della sua massima escursione, così da non esercitare una leva esagerata sul legno.
Dopo aver dimensionato le catenelle in modo uguale rimuovendo o tagliando un anello, posizionale in modo che sostengano il peso del coperchio aperto così che non gravi sulle cerniere e fissale con 4 delle viti lunghe meno di 1cm.
Sebbene meccanicamente sarebbe meglio, non disporre il fissaggio inferiore troppo verso il bordo anteriore altrimenti quando si chiuderà il coperchio andranno sopra alla strip UV Shelly che ha le piste elettroniche a vista… Tienilo in considerazione per individuare i punti di fissaggio delle viti.

Catenelle per limitare l'apertura del coperchio dello sterilizzatore UV smart

Ora pensiamo alla parte elettrica

Per rendere l’operazione il più veloce e sicura possibile ho pensato di fissare una scatola di derivazione sul lato della scatola in cui contenere la parte in tensione, così che il tutto sia sicuro. E’ possibile farlo anche all’interno della scatola per renderla più estetica ma, ripeto, il leit motif di questa scatola era “pronta domani“.

Per fissare la scatola bastano quattro delle viti autofilettanti lunghe meno di 1cm, sul lato della scatola. A questo punto pratica un foro con una punta sufficientemente grande da permettere il passaggio del connettore microusb del cavo dell’alimentatore di recupero che hai trovato. Il foro va fatto sul fondo della scatola di derivazione in vicinanza a dove si fisserà la strip UV, come in figura:

Foro di passaggio tra la scatola di derivazione e l'interno dello sterilizzatore UV smart

Ora puoi fissare con due delle viti lunghe meno di 1cm la strip Shelly UV sul fianco nelle vicinanze del foro praticato precedentemente. Consiglio di fissare la strip con il cavo attaccato per verificare che il connettore non sforzi nella posizione di fissaggio:

Strip UV di Allterco Robotics posizionata nell'interno dello sterilizzatore UV smart

Crea adesso i collegamenti elettrici partendo dalla spina volante a cui collegherai il cavo guainato 2×1 di lunghezza adeguata per arrivare dalla presa che vuoi usare allo sterilizzatore. Fora la scatola (tagliando la punta di un passacavo di gomma se usi quella linkata) e fai entrare il cavo nella scatola di derivazione.

All’interno usa i due morsetti e crea i collegamenti seguendo questo semplice schema:

Schema di collegamento per realizzare la parte elettrica dello sterilizzatore UV smart usando uno Shelly 1, la strip UV di Allterco Robotics, un alimentatore microUSB di recupero, una spina e una presa volanti. Oltre a cavo 230V e morsetti.
Usa sempre i puntalini per effettuare i collegamenti elettrici nei morsetti di ogni tipo. Shelly monta dei morsetti un po’ più corti del normale per cui sarà necessario tagliare qualche millimetro dalla punta affinché il puntalino sia completamente infilato nel morsetto (non deve vedersi la parte metallica) Se non hai puntalini e la pinza crimpatrice ti posso consigliare questo ottimo kit che ho comprato io, sarai a posto per tanti anni!

Ora collega un Aqara Door & Window a protezione dell’apertura con il corpo nella parte inferiore e il magnete nel coperchio, come indicato nella seguente foto:

Sensori Aqara Door & Windows posizionati all'interno dello sterilizzatore UV smart per prevenire l'esposizione ai raggi UV in caso di apertura accidentale della porta durante il funzionamento

Se vuoi utilizzare un tag NFC puoi posizionarlo sul dorso del coperchio in modo che sia accessibile quando lo chiudi.

A questo punto non resta che inizializzare lo Shelly con la sua app o collegandosi al suo SSID, collaudare che accendendo lo Shelly la strip si accenda e chiudere la scatola di derivazione (lo sai vero che se la chiudi senza collaudare qualcosa andrà storto… 😀 )

Integrazione in Home Assistant

Realizzato il nostro sterilizzatore passiamo ora ad integrarlo creando le automazioni che ci servono per renderlo smart.

Presupposto di questo package è che lo Shelly che gestisce l’accensione della strip UV si chiami switch.sterilizzatore, che l’Aqara si chiami binary_sensor.porta_sterilizzatore e che tu abbia il mio package multinotify per le notifiche.

Il file zip scaricato contiene il file sterilizzatore.yaml: posizionalo nella tua cartella config/packages (se non sai cosa sono leggi la pagina della documentazione ufficiale oppure questa sezione del blog di Vito Antonucci)

Configurazione Alexa

Se il tuo hardware è lo stesso e chiamato come specificato sopra dovresti già avere tutto funzionante. Resta solo da esporre ad Alexa lo script sterilizza e configurare una routine per richiamarlo.

La prima operazione è semplicissima se utilizzi Nabu Casa per integrare Alexa (cosa che ti consiglio: 5$ al mese ben spesi per un ottimo servizio e aiuti il progetto di Home Assistant a rimanere vivo. E no… non me ne viene in tasca nulla…)
Se utilizzi l’UI per decidere quali device esporre vai in Impostazioni -> Home Assistant Cloud -> GESTIRE LE ENTITA’ (dal pannello Alexa) e verifica che l’entità sterilizza sia selezionata.
Se invece utilizzi un package o un include yaml per definire cosa esporre ad Alexa (qui la documentazione alla voce Manual configuration) allora assicurati che lo script sterilizza sia incluso nei criteri di inclusione e non sia presente in quelli di esclusione che hai definito.

Dopo un bel riavvio per far rilevare ad Alexa la nuova entità configuriamo una routine.

Apri la tua app Alexa dallo smartphone, vai in Altro, Routine, premi il tasto + in alto a destra, clicca su Quando questo accade, clicca Voce, e dopo “Alexa, ” scrivi sterilizza mascherine, poi premi Avanti in alto a destra.
Poi fai click su Aggiungi un’azione, scegli Casa intelligente, Controlla scenario e infine sterilizza.
Se hai fatto tutto correttamente dovresti vedere la routine fatta così:

Configurazione della routine di Alexa per richiamare lo script sterilizza

Questo farà si che dicendo “Alexa, sterilizza mascherine” lo script “sterilizza” venga eseguito da Home Assistant.

Come funziona il package?

Come di consueto analizziamo il package per capire come funziona esattamente così da comprenderne i criteri e imparare a modificarlo secondo le nostre esigenze.
Partiamo dalle definizioni:

timer:
  sterilizzazione:
    name: sterilizzazione
    duration: '00:30:00'
    icon: mdi:shield-bug-outline

input_number:
  sterilizzazione_min:
    name: Durata sterilizzazione (min)
    min: 1
    max: 60
    step: 1
    mode: slider
    icon: mdi:timer-outline

Il timer, con durata 30 minuti ma in realtà configurabile, serve per tenere il conteggio del tempo di sterilizzazione e verrà avviato tramite lo script sterilizza, messo in pausa e riavviato all’apertura e chiusura della porta fino al suo completamente quando verrà notificato il termine della sterilizzazione e spenta la luce UV.

L’input_number sterilizzazione_min serve invece per poter scegliere tramite interfaccia utente il tempo desiderato di sterilizzazione (vedi capitolo in fondo).

Lo script sterilizza

script:
  sterilizza:
    description: Avvia ciclo di sterilizzazione per il tempo configurato
    sequence:
      - choose:
          - conditions:
              - condition: state
                entity_id: binary_sensor.porta_sterilizzatore
                state: 'off'
            sequence:
              - service: timer.start
                entity_id: timer.sterilizzazione
                data:
                  duration: '{{ states("input_number.sterilizzazione_min") | int * 60 }}'
              - service: switch.turn_on
                entity_id: switch.sterilizzatore
              - service: script.multinotify
                data:
                  message: 'Avvio sterilizzazione mascherine per {{states("input_number.sterilizzazione_min") | int}} minuti'
                  alexa_target: media_player.pian_terreno
                  alexa_volume_target: media_player.pian_terreno
        default:
          - service: switch.turn_off
            entity_id: switch.sterilizzatore
          - service: script.multinotify
            data:
              message: 'Non posso avviare lo sterilizzatore! Chiudi prima il coperchio!'
              alexa_target: media_player.pian_terreno
              alexa_volume_target: media_player.pian_terreno

La radice dello script è un choose che possiamo immaginare in questo caso come un if – else. La condizione è che lo stato di binary_sensor.porta_sterilizzatore sia 'off'. Se così procede nella prima sequenza in cui:

  • avvia il timer sterilizzazione inizializzandolo al tempo espresso nell’input_number.sterilizzazione_min ma trasformato in secondi
  • accende l’uscita dello Shelly chiamata switch.sterilizzatore
  • notifica tramite l’Echo Dot posizionato vicino allo sterilizzatore (personalizza il nome al tuo caso) con un annuncio come “Avvio sterilizzazione mascherine per 30 minuti”, a seconda di quanto era stato configurato il tempo nell’input_number.

Se invece la condizione è falsa, ovvero il binary_sensor.porta_sterilizzatore è 'on', esegue la sequenza in default:

  • spegne l’uscita dello Shelly che comanda la strip UV (serve nel caso sia richiamato dall’accensione direttamente dello Shelly da HA o dall’app Shelly, tramite un’automazione che vedremo)
  • notifica all’Echo Dot posizionato vicino allo sterilizzatore (personalizza il nome al tuo caso) con un annuncio come “Non posso avviare lo sterilizzatore! Chiudi prima il coperchio!”

Le automazioni

  # Accensione sterilizzatore da tag NFC
  - id: 45efb6ec-afe2-4b3e-ad66-e36d6c7d3804
    alias: 'Sterilizzatore: accensione da NFC'
    description: "Alla lettura dell'NFC specifico attiva lo sterilizzatore"
    trigger:
      - platform: event
        event_type: tag_scanned
        event_data:
          device_id: bbe022fb618d4227
          tag_id: 67b10970-5a9a-41af-b5b7-6dee41c943d5
    condition: []
    action:
      - service: script.sterilizza

La prima automazione serve per avviare la sterilizzazione tramite la lettura del tag NFC che avremo assegnato. Se non hai mai usato i tag NFC ti consiglio la lettura del post di Home Assistant.

Il trigger di lettura può avvenire indifferentemente tramite l’evento tag_scanned, come in questo codice, oppure tramite il seguente trigger come fa l’interfaccia utente (il risultato è identico):

  - platform: tag
    tag_id: 67b10970-5a9a-41af-b5b7-6dee41c943d5
Ricorda di documentare sempre le tue automazioni e procedure per facilitarne la comprensione quando passa un po’ di tempo. Se segui il mio consiglio prima o poi mi ringrazierai, te lo garantisco!
Ricorda anche di inserire sempre il valore id: con un valore univoco (io uso l’addon UUID Generator di VSCode) senza il quale il debug delle automazioni non verrebbe registrato.
  # Accensione sterilizzatore esterna
  - id: b368b4b6-0427-4a1c-b6de-60ed483dc2b2
    alias: 'Sterilizzatore: accensione esterna'
    description: 'Accensione sterilizzatore da app Shelly o da Alexa usando direttamente lo switch, senza passare dallo script'
    trigger:
      - platform: state
        entity_id: switch.sterilizzatore
        to: 'on'
    condition:
      - condition: state
        entity_id: timer.sterilizzazione
        state: 'idle'
    action:
      - service: script.sterilizza

Questa automazione serve nel caso in cui si accenda direttamente lo Shelly che alimenta la strip UV, da Home Assistant o dall’esterno, se il cloud di Shelly è attivo, tramite l’app. (a tal proposito consiglio la lettura dell’articolo dedicato a quale integrazione usare per Shelly).

Determiniamo tramite la condizione che il timer sia idle, cioè inattivo. Se abbiamo fatto partire noi la sterilizzazione, infatti, il timer viene avviato PRIMA di attivare lo Shelly e quindi questa automazione troverà il timer già attivo, ignorandone le azioni.
Se invece il timer viene trovato inattivo all’attivazione dello Shelly significa che è stato attivato manualmente.

In questo caso viene quindi chiamato lo script sterilizza che, a seconda dello stato della porta, fa partire il timer con coperchio chiuso o spegne lo Shelly con porta aperta, per poi pronunciare la notifica tramite Alexa.
Questo dovrebbe aver chiarito perchè spegnere lo Shelly dallo script nel caso di porta aperta 😉

  # Apertura porta sterilizzatore durante il funzionamento
  - id: aae2f22c-0b08-401e-af28-fb33622b63ad
    alias: 'Sterilizzatore: porta aperta'
    description: Quando si apre la porta dello sterilizzatore mentre il ciclo è attivo
    trigger:
      - platform: state
        entity_id: binary_sensor.porta_sterilizzatore
        to: 'on'
    condition:
      - condition: state
        entity_id: switch.sterilizzatore
        state: 'on'
    action:
      - service: switch.turn_off
        entity_id: switch.sterilizzatore
      - service: timer.pause
        entity_id: timer.sterilizzazione
      - service: script.multinotify
        data:
          message: 'La sterilizzazione è stata interrotta per la tua sicurezza. Riprenderà alla chiusura del coperchio. Mancavano {{state_attr("timer.sterilizzazione", "remaining").split(":")[0] | int * 60 + state_attr("timer.sterilizzazione", "remaining").split(":")[1] | int }} minuti.'
          alexa_target: media_player.pian_terreno
          alexa_volume_target: media_player.pian_terreno

Cosa facciamo se qualcuno apre la porta dello sterilizzatore durante il funzionamento? Ci pensa questa automazione con trigger l’apertura e condizione la strip UV accesa.
Queste le azioni intraprese:

  • Spegne la strip UV
  • Mette in pausa il timer
  • Pronuncia una notifica come “La sterilizzazione è stata interrotta per la tua sicurezza. Riprenderà alla chiusura del coperchio. Mancavano 13 minuti.

Il template prende l’attributo remaining dell’entità timer.sterilizzazione che indica quanto tempo manca nel formato OO:MM (dove OO sono le ore e MM i minuti), ne fa lo split sul carattere “:” restituendo un array di due elementi (le ore e i minuti), le converte in intero e nel primo caso [0] moltiplica per 60 per trovare i minuti nel secondo caso [1] li somma come sono essendo già minuti. Il risultato è il numero di minuti totale mancante che verrà pronunciato.

  # Chiusura porta quando la sterilizzazione è stata precedentemente interrotta
  - id: 5b9b25f2-5768-4b62-8af8-561a4af32a58
    alias: 'Sterilizzatore: porta chiusa'
    description: Quando si chiude la porta dello sterilizzatore mentre il timer non è ancora a zero
    trigger:
      - platform: state
        entity_id: binary_sensor.porta_sterilizzatore
        to: 'off'
    condition:
      - condition: state
        entity_id: timer.sterilizzazione
        state: paused
    action:
      - service: switch.turn_on
        entity_id: switch.sterilizzatore
      - service: timer.start
        entity_id: timer.sterilizzazione
      - service: script.multinotify
        data:
          message: 'La sterilizzazione è stata ripresa. Mancano {{state_attr("timer.sterilizzazione", "remaining").split(":")[0] | int * 60 + state_attr("timer.sterilizzazione", "remaining").split(":")[1] | int }} minuti.'
          alexa_target: media_player.pian_terreno
          alexa_volume_target: media_player.pian_terreno

Questa è l’automazione complementare alla precedente: quando il coperchio viene chiuso dopo essere stato riaperto (lo determiniamo dalla condizione che vuole il timer in stato di pausa) vengono eseguite le seguenti azioni:

  • Riaccensione della strip UV tramite lo Shelly
  • Ripartenza del timer da dov’era rimasto
  • Notifica sterilizzazione è ripresa pronunciando anche il numero di minuti rimanenti, con stessa tecnica spiegata precedentemetne.
  # Fine sterilizzazione
  - id: c4d4f592-824e-448c-94c6-807933050077
    alias: 'Sterilizzatore: fine'
    description: Quando il ciclo di sterilizzazione termina
    trigger:
      - platform: state
        entity_id: timer.sterilizzazione
        to: 'idle'
    condition: []
    action: 
      - service: switch.turn_off
        entity_id: switch.sterilizzatore
      - service: timer.finish
        entity_id: timer.sterilizzazione
      - service: script.multinotify
        data:
          message: 'La sterilizzazione è terminata. Puoi ora aprire il coperchio in sicurezza.'
          alexa_target: media_player.pian_terreno
          alexa_volume_target: media_player.pian_terreno

Non rimane che una automazione necessaria: la fine della sterilizzazione.
In questo caso il trigger è il termine del timer senza condizioni.

condition: [] è opzionale, una volta era necessario specificarlo, oggi non lo è più

Le azioni intraprese saranno le seguenti:

  • Spegnimento strip UV
  • Termine del timer con ritorno allo stato idle (per sicurezza, non dovrebbe essere comunque necessario)
  • Notifica che la sterilizzazione è terminata e si può aprire il coperchio in sicurezza.

Creazione della card per l’interfaccia grafica

Non è necessario per il funzionamento ma può essere utile per azionarne il funzionamento tramite app o verificare il tempo residuo creare una card per lo sterilizzatore UV smart. Il risultato sarà il seguente:

Card del nostro sterilizzatore UV smart

Per creare questa card modifica la plancia tramite i tre puntini in alto a destra, Modifica la plancia, tasto in basso a destra + AGGIUNGI SCHEDA, Manuale e incolla il seguente codice:

type: entities
title: Sterilizzatore
show_header_toggle: false
entities:
  - entity: timer.sterilizzazione
    name: Timer
  - entity: switch.sterilizzatore
    name: In funzione
  - entity: binary_sensor.porta_sterilizzatore
    name: Coperchio

Oppure aggiungi il tipo di card entità e configurala in questo modo:

Come configurare la card usando l'interfaccia grafica

Avrai un’utile card di controllo e comando dello sterilizzatore, utile anche in caso di problemi per capire cosa stia accadendo.

Ti va di darmi una mano?

Il contenuto di questo sito è completamente gratuito senza pubblicità invasive e il fine non è certo guadagnare …ma mantenere un sito ha un costo. Se ti va di darmi una mano per sostenere le spese o ti va di sostenere questo progetto hai le seguenti modalità:


  • Donazione con Paypal:

  • Regalami un caffè su Buymeacoffee:


  • Effettua i tuoi acquisti Amazon a partire da QUESTO LINK (o tramite i prodotti sotto)

  • Effettuare i tuoi acquisti AliExpress usando QUESTO LINK

Henrik Sozzi

Sono un analista programmatore per lavoro e per passione. Amo la domotica, la stampa 3D e la tecnologia in generale. Mastodon: @pixel

Rispondi

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.