Agente AI delle previsioni meteo

Da quando ho incominciato ad andare al lavoro in bicicletta non tornerei più indietro: al lavoro arrivo più sveglio, esercizio fisico mattutino, maggior risparmio per non consumare benzina, niente stress da traffico e la mia mente è molto più attiva rispetto a quando venivo in macchina.
Questa è per me una “fortuna”, non tutti hanno la possibilità (o la voglia 😅) di recarsi in bici sul luogo di lavoro, però ho un problema: il tempo.

Il tempo influenza molto il mio abbigliamento e devo sempre vestirmi in base alle temperature attese o se ci sarà pioggia. Ogni sera e ogni mattino apro il mio sito web preferito (quello che reputo più affidabile), il mitico 3bmeteo.com e controllo le previsioni del giorno dopo. Se la notte ha piovuto controllo anche i dati della mia stazione meteo Shelly: se ha piovuto molto prenderò una strada più lunga ma più pulita, in caso contrario prenderò la strada che passa attraverso un boschetto.

Questo pattern di ricerca ricorrente mi ha spinto ad automatizzare / migliorare la lettura del meteo e come esperimento ho fatto gestire la lettura del meteo ad un agente AI.

Step 1: automatizzare la lettura dal sito delle previsioni

Siamo nell’era dell’IA, mi sarebbe bastato affidare la lettura delle previsioni ad un qualsiasi modello in grado di farlo, ma:

  1. Avrei creato una dipendenza con il modello
  2. Non ho un modello AI locale, perciò ogni chiama, seppur piccola, avrebbe avuto un costo

Dati questi due motivi ho deciso di realizzare un tool che permettesse di automatizzare la lettura delle previsioni dal sito web 3bmeteo, con anche una gestione della cache e un auto-aggiornamento dati. Lo stesso servizio avrebbe dovuto alcuni endpoint API, consumabili dal modello, per ottenere un json con le previsioni.
Il progetto non è vincolato al mio provider preferito ma l’ho pensato per essere versatile.

Il progetto è disponibile sul mio Github ma è anche possibile trovarlo sul Docker Hub. Nella directory Docker del repository potete trovare il Docker compose ed il template del file .env per poterlo avviare.

Se volete replicare quanto ho fatto basterà scaricare il progetto git, entrare nella directory docker, clonare .env.template in .env ed eseguire docker compose up -d.

Il servizio permette anche di scrivere i json delle previsioni su file system, nel caso in cui non si voglia/possa dare accesso alle api al modello. Con i json su file system il vostro modello potrà leggerli come file di contesto.

Step 2: Ottenere i dati dalla stazione meteo

Nel 2025 mi sono classificato primo e terzo in una competizione Shelly e con il buono ricevuto come premio ho acquistato una stazione meteo dal loro sito web.

Dal punto di vista dell’integrazione non è una buona scelta, in quanto i dati li devo recuperare dal cloud e non posso accedere direttamente alla stazione. Per risolvere questo problema ho esteso un’applicazione che già avevo realizzato (e che mi aveva fatto classificare al primo posto), un progetto che esponeva i dati Shelly come Api Rest e come server MCP.
Tramite questo tool ho semplificato l’accesso ai dati della stazione meteo (e di tutto l’ecosistema shelly), in modo tale da poterli facilmente integrare nei miei progetti personali.

🔗 Link progetto Github
🔗 Link API Rest DockerHub
🔗 Link server MCP DockerHub

Sul repository Github troverete le istruzioni ed il docker compose per avviare il progetto

Step 3: n8n come orchestratore

Sul mio homelab avevo già installato n8n e lo avevo già utilizzato per altre automazioni, ma non lo avevo mai provato per orchestrare un flusso IA.
Se ti servisse avviare un’istanza di n8n in locale è possibile farlo tramite docker compose (che trovi qui), l’istanza che ho utilizzato è avviata dal docker compose esposto nella documentazione.

Step 4: OpenRouter per il modello IA

Per chi non lo conoscesse OpenRouter è un servizio web che ti permette di acquistare crediti da spendere con l’utilizzo di modelli AI di diversi provider, sia quelli più chiacchierati (es. modelli di Anthropic) fino ai modello Open.
Per questo esperimento ho provato differenti Qwen3.5, Gemma 3, Gemma 4, Gpt-4o-mini e tutti mi hanno dato risultati molto simili. La scelta di OpenRouter è mandatoria per chi non possiede un hardware in casa per eseguire modelli in locale e lo preferisco alle api proprietarie perchè mi garantisce la flessibilità di non legarmi ad uno specifico vendor.
Per quanto riguarda i costi sono davvero trascurabili, ma ne parleremo dopo.

Step 5: Telegram per le notifiche

Dove ricevere le notifiche? Beh, Telegram! Non è una risposta scontata ma ho già lavorato diverse volte con telegram e ho già attive altri bot per gestire diversi progetti.
Per questo scopo ho scelto di ricevere le notifiche delle previsioni tramite un bot che avevo già configurato e dove ricevevo già altre informazioni.

Step 6: uniamo tutto!

E’ giunto il momento di procedere con al fusione di tutti gli elementi che abbiamo preparato.

Nodo AI Agent

Come prima cosa ho creato un nuovo scenario in n8n e ho importato al centro della scena il tool AI Agent, che ci permetterà di orchestrare tutto il flusso.

Ora dobbiamo collegare i nodi Chat model (io utilizzo OpenRouter) e nei tool colleghiamo le API Shelly e WeatherAgents. In questo specifico scenario non serve di mantenere una memoria del’agente perchè le previsioni cambiano di ora in ora e memorizzare le risposte porterebbe a risultati errati.

Entrando nel nodo “Weather agent” dobbiamo configurare il prompt ed il system message.
Per quanto riguarda il primo andremo ad inserire una variabile, poichè il prompt verrà passato da un altro oggetto (lo vediamo tra poco).

Markdown
{{ $json.chatInput }}

Per quanto riguarda il secondo, il system message, andiamo ad impostarlo in questo modo:

Markdown
Sei un presentatore di previsioni meteo ed il tuo scopo è rispondere solamente alle domande inerenti alle previsioni meteo.

# Regole
* Ragiona sempre con le date in formato dd/MM/yyyy
* Fornisci solo previsioni tra oggi ed i successivi 7 giorni
* Rispondi nella lingua dell'utente
* La data e ora di adesso è: {{ $now }}

# Tool
Questi sono i tool che hai a disposizione:

## Shelly Weather Station (ora + storico)
* Se l'utente ti chiede un'informazione sul meteo di ADESSO utilizza il tool "Shelly Weather Station" filtrando per la data e l'ora corrente
* Se l'utente ti chiede un'informazione STORICA sul meteo utilizza il tool "Shelly Weather Station" filtrando per la data e l'ora richiesta dall'utente

## Weather forecast (futuro)
* Usa questo tool quando devi sapere le previsioni meteo di un giorno specifico
* il tool si chiama "Weather forecast". 
* Passa le date nel formato yyyy-MM-dd

Il system message ha tutte le carte in regola per essere un buon prompt:

  • Assegnazione del ruolo (presentatore)
  • Regole su come lavorare e rispondere
  • Elenco dei tool e spiegazione di come utilizzarli

Prompt e schedulazione

Come detto ad inizio articolo, il mio obiettivo era di ricevere le previsioni alla sera e al mattino in modo automatico.

  • Alla sera voglio sapere le previsioni meteo e le temperature previste.
  • Al mattino voglio sapere (dalla stazione meteo) la temperatura, se ha piovuto e quanto, più le previsioni della giornata
    Dobbiamo quindi preparare due prompt differenti e per farlo ho utilizzato un nodo “Edit fields (set)” per impostare la variabile “chatInput” che abbiamo definito nel nodo agente poco fa).

Aggiungiamo due nodi al workflow e impostiamo i prompt come ho fatto io:

Prompt della sera

Markdown
# Compito
Scrivi un breve messaggio dove mi indichi:
* Quanto ha piovuto dalle 19 alle 21 di oggi (Se non ha piovuto non scrivere questo punto)
* Se dalle 21 di oggi alle 7 di domani mattina pioverà (tool forecast, oggi e domani)
* Se dalle 7 di domani mattina alle 19 di domani pioverà e come sarà il tempo (tool forecast, giorno di domani)

# Regole
* Se è prevista pioggia indica anche a che ora pioverà e quanto pioverà
* Aggiungi un'icona in base al meteo atteso
* Fai molta attenzione a chiamare i tool con le date corrette
* Specifica gli orari di minima e di massima attesi
* Specifica quanti gradi ci saranno alle ore 7 del mattino

# Esempi
* "Ha piovuto 18mm dalle 19 alle 20, ora non sta piovendo. Non è prevista pioggia questa notte e domani sarà soleggiato. Le temperature oscilleranno tra i 10 e i 28 gradi. Alle 7 ci saranno 11 gradi"
* "Questa notte sono previsti 5mm di pioggia. Domani pioverà dalle 9 fino alle 10 e poi dalle 12 alle 19. Le temperature oscilleranno tra i 10 e i 28 gradi. Alle 7 ci saranno 11 gradi"

# Contesto
La data e ora di adesso è: {{ $now }}

Prompt del mattino

Markdown
# Compito
Scrivi un breve e conciso messaggio dove mi indichi:
* Se dalle 23 di ieri alle 7 di oggi ha piovuto 
* Quale è il meteo di oggi (se pioverà indica anche quanto)

# Regole
* Se è prevista pioggia indica anche a che ora pioverà e quanto pioverà
* Aggiungi un'icona che indica la previsione meteo atteso
* Fai molta attenzione a chiamare i tool con le date corrette
* Specifica quanti gradi ci sono in questo momento (recupera l'informazione dalla stazione meteo)

# Contesto
* La data e ora di adesso è: {{ $now }}

# Esempi
* "Questa notte ha piovuto 7mm dalle 3 alle 5. Oggi è previsto sole e ci sono 11 gradi."
* "Ieri sera alle 23 ha piovuto 2mm, poi ha smesso. Oggi ci sarà nuvoloso e ora ci sono 14 gradi."
* "Questa notte non ha piovuto, oggi sono previsti temporali dalle 15 alle 18. Al momento ci sono 18 gradi"

A questo punto ci mancano due elementi per completare: un trigger di attivazione e l’output verso la nostra chat di Telegram.

Per quanto riguarda il primo punto possiamo utilizzare uno “Schedule trigger”, impostando la data e l’ora in cui vogliamo che il workflow venga eseguito, collegato al nodo con il prompt che abbiamo appena creato

Per quanto riguarda Telegram invece, scegliamo il nodo “Telegram -> Send a chat message“, impostando il nostro account.
Il testo del messaggio sarà:

JSON
Previsioni meteo:<br>{{ $json.output}}

A questo punto siamo pronti per eseguire il nostro workflow!
Per non farmi mancare nulla, ho impostato i due prompt visti poco fa dal lunedì al venerdì e poi ne ho aggiunto un terzo, più generico, per il sabato e la domenica.

In più ho anche aggiunto un nodo chat per poter testare il nodo dell’agente senza passare dai prompt preimpostati. Questo punto è utile soprattutto in fase di sviluppo dello scenario.

Costi

Il costo per ogni singola esecuzione dipende largamente dal modello utilizzato, anche se non dobbiamo aspettarci costi elevati, essendo che il prompt è molto piccolo e la chiamata alle api restituisce già un json strutturato.

1 singola esecuzione con Gpt-4o-mini costa 0,0003335 $.
1 mese di esecuzioni (mattina + sera) costa circa 0,3 $.

Conclusioni

L’IA sta cambiando molto l’approccio con cui affrontiamo molte tipologie di problemi, e questo piccolo esperimento ne è la dimostrazione pratica.

Quello che vi ho mostrato in questo articolo lo avrei risolto in passato con un “semplice” tool che orchestrava tutta la logica: avrei scritto codice per recuperare i dati meteo, altro codice per interrogare la stazione, ancora altro codice per formattare il messaggio e infine per inviarlo su Telegram.

Detto questo anche l’IA ha i suoi contro: la scelta di scrivere un servizio rest per ottenere le informazioni dal sito web del meteo è una scelta voluta, in quando l’IA non ha un’esecuzione prevedibile. Volevo inoltre un tool che poteva essere riutilizzato in diversi contesti e da altri agenti.

Se volete replicare il progetto o avete domande, i repository sono tutti pubblici e sono disponibile nei commenti!

Alla prossima!

Condividi questo articolo
Shareable URL
Post precedente

Minimal api VS controller

Prosimo post

Le novità di Angular 22

Leggi il prossimo articolo

C# 14

Nella .NET conf 2025 è stato presentata la nuova versione di C#, in questo articolo vedremo quali sono le novità…