Rendiamo smart il nostro albero di mango con ESP8266, ESPHome e Home Assistant

Andiamo a vedere come realizzare da soli un piccolissimo sistema di monitoraggio del terreno e dell’ambiente in cui viva un alberello di mango che abbiamo fatto nascere da un seme piantato a Settembre. L’obiettivo è monitorare umidità del suola, temperatura e umidità relativa dell’aria, all’interno di una mini-serra improvvisata, per proteggere la nostra pianta degli sbalzi di climatici e dal freddo dell’inverno. In generale, il mango resiste senza problemi agli inverni in Sicilia, ma noi siamo premurosi e vogliamo prevenire.

Componenti

Per realizzare il nostro piccolo progetto, che speriamo poi di espandere in modo più complesso, abbiamo scelto una Wemos D1 Mini con chip ESP8266, un sensore DHT11 per umidità relativa e temperatura, un igrometro con segnale analogico, una batteria da 3,7V e 2000mAh, un modulo di ricarica TP4056 e una piccola scatola di derivazione di 100x68x50mm.

Per i collegamenti ci siamo affidati ai classici jumper, effettuando qualche saldatura dove necessaria. Ricordiamo che questo è un piccolo progetto DIY, base per un progetto più ampio che vorremmo realizzare per il futuro. Difatti, il DHT11 è stato scelto come strumento di misurazione temporaneo, sapendo che questo sensore è uno dei meno precisi, sebbene sia tra i più economici.

Lista componenti su Amazon:

Lista componenti su Aliexpress:

Collegamenti

Pariamo proprio dai collegamenti elettrici. Per alimentare sia la dev-board che i sensori abbiamo bisogno dei 3V, erogati sia dalla batteria a litio da 2000mAh e sia dal modulo di ricarica TP4056 con ingresso Micro-USB a 5V, ideale per essere adoperato con i caricabatterie degli smartphone. Il led rosso indica lo stato di carica, mentre un led blu si accenderà quando la batteria è carica.

Controller

Il sensore DHT11 è stato collegato al pin digitale D5 della Wemos D1 Mini, mentre l’igrometro capacitivo all’unico pin analogico A0. Ricordiamoci che tutti i sensori ed il polo negativo della batteria condividono un solo GND.

Infine, per risparmiare al meglio l’energia e ottenere una lunga durata della batteria, abbiamo connesso il pin RESET al pin digitale D0 per attivare e programmare la modalità di Deep Sleep, che permetterà alla dev-board di eseguire il codice a intervalli regolari e poi entrare in modalità di risparmio energetico.

Codice

Il codice scritto su ESPHome [LINK] è abbastanza semplice, non necessita di particolari accortezze. Tuttavia, prima di scrivere il nostro codice, dobbiamo entrare in Home Assistant, muoverci su ESPHome e andiamo a creare un nuovo device su ESPHome e chiamiamolo Mango. Saltiamo per il momento la connessione e selezioniamo la scheda che dobbiamo programmare (ESP8622).

Una volta creato, clicchiamo su EDIT per modificare il codice.  Per prima cosa dichiariamo che si tratta di una dev-board Wemos D1 Mini.

esphome:
  name: mango
  friendly_name: Mango

esp8266:
  board: d1_mini

Saltiamo la parte relativa all’API, OTA e Wi-Fi perchè avviene in maniera automatica, passiamo alla configurazione dei sensori. Iniziamo con DHT11, specificando sia la piattaforma (dht) che il modello (dht11), sebbene quest’ultimo parametro sia opzionale. Dichiamo il pin a cui è connesso il sensore (GPIO14) e definiamo alcuni parametri per il rilevamento di temperatura e umidità, indicando un nome amichevole, l’unità di misura e l’accuratezza.

sensor:
  - platform: dht
    model: DHT11
    pin: GPIO14          # Pin D5 sul D1 Mini corrisponde a GPIO14
    temperature:
      name: "Temperatura"
      unit_of_measurement: "°C"
      accuracy_decimals: 0
    humidity:
      name: "Umidità"
      unit_of_measurement: "%"
      accuracy_decimals: 0
    update_interval: 2s

Per quanto riguarda l’igrometro abbiamo dichiarato che è connesso al pin A0, specificando che lavoriamo su piattaforma analogica (adc) e indicando un nome amichevole, l’unità di misura e l’accuratezza. Una cosa che potrebbe farvi perdere tempo è la calibrazione del sensore, che vi lasciamo nel formato generico ma potrebbe richiedere qualche tentativo di settaggio, visto che non tutti i sensori analogici sono perfettamente calibrati.

  - platform: adc
    pin: A0           # Pin analogico A0 sul D1 Mini
    name: "Umidità del Suolo"
    unit_of_measurement: "%"
    accuracy_decimals: 1
#   update_interval: 2s
    filters:
      - calibrate_linear:
         - 3.3 -> 0.0       # In aria
         - 0.1 -> 100.0      # Terreno moderatamente umido

Concludiamo con il deep sleep, ossia mandiamo a dormire la scheda per circa venti minuti dopo che è rimasta attiva per 20 secondi, leggendo i dati dal sensori e caricandoli su Home Assistant. La dev-board si riattiva dopo venti minuti, ripete il ciclo di lettura e invio, poi ritorna in modalità di sonno profondo per risparmiare corrente.

deep_sleep:
  run_duration: 120s
  sleep_duration: 1200s

Ricordatevi di lasciare il vostri dati relati all’OTA e all’API. Salvate e verificate con Validate se il codice è stato scritto correttamente. Potete ora installare il codice sulla vostra dev-board. Ci vorrà un po’ di tempo.

Conclusa l’installazione, integriamo il device su Home Assistant. Dovrebbe essere arrivata una notifica sulla plancia. In ogni caso, per integrarlo andate su Impostazioni -> Dispositivi e servizi e apparirà il dispositivo Mango da integrare. Autorizzate la configurazione ed otterrete quanto segue.

Possiamo ora monitorare lo stato del nostro mango, impostando automazione che ci avvisino quando il terreno è asciutto oppure che ci invitino ad entrare in casa l’alberello se la temperatura è troppo bassa.

Se ci fossero problemi nella memorizzazione del segnale analogico, causati dalla perdita del segnale per il Deep Sleep, basterà creare un sensore “stabile” nel file configuration.yaml

sensor:
  - platform: template
    sensors:
      umidita_del_suolo_stabile:
        value_template: >
          {% if states('sensor.mango_umidit_del_suolo') != 'unavailable' %}
            {{ states('sensor.mango_umidit_del_suolo') }}
          {% else %}
            {{ states('sensor.umidita_del_suolo_stabile') }}
          {% endif %}
        friendly_name: "Umidità del Suolo Stabile"
        unit_of_measurement: "%"