“NodeRed: programmazione settimanale e comunicazione con servizi Home Assistant”

“NodeRed: programmazione settimanale e comunicazione con servizi Home Assistant”

Benvenuti al secondo articolo dedicato a NodeRed e la sua integrazione con Home Assistant. Un ringraziamento al nostro utente Giovanni C. per questa guida. Andremo ora a vedere in dettaglio i concetti base della programmazione, come funzionano le variabili e come i “messaggi” vengono passati da un nodo all’altro ed infine costruiremo un paio di automazioni che sono sicuro potrete utilizzare come spunto per le vostre esigenze.

OGGETTI E VARIABILI:

Come spiegato la volta precedente l’elemento base di NodeRed sono in “nodi” ed il modo in cui essi sono collegati ne determina l’interazione; i nodi comunicano fra di logo con “oggetti” che sono altro che variabili e che, a meno che non specificato differentemente, esistono solo all’interno del nodo; quando un nodo finisce il suo compito passa al/ai nodo/i successivi un oggetto denominato “msg” del quale il componente che più utilizzerete è “msg.payload” che contiene di default il “risultato” del nodo da cui proviene; tutte le altre variabili eventualmente usate all’interno di un nodo vengono distrutte quando il “flow” passa al nodo successivo; ovviamente è possibile fare in modo che certe variabili vengano preservate, e per fare ciò esse andranno definite con il loro “scope” secondo la tabella qui sotto:

  • Variabili “CONTEXT”: una variabile di tipo “context” rimarrà accessibile sempre e solo nel nodo in cui è stata definita ma al contrario delle variabili normali il contenuto non verrà distrutto alla fine di ogni esecuzione del nodo e la ritroverete li al successivo richiamo di quel nodo.
  • Variabili “FLOW”: queste variabili esistono all’interno di un “flow” (ricordate che il flow è l’insieme di sequenze di nodi all’interno della stessa pagina) e potrete accedervi anche da altre sequenze purché rimaniate nello stesso flow, il contenuto non verrà mai distrutto se non volontariamente.
  • Variabili “GLOBAL”: simili alle variabili “FLOW” ma esse saranno accessibili anche da tutti gli altri flow che avrete definito in NodeRed.

Al momento tutto ciò potrà sembrarvi complesso ma è solo una questione di prenderci la mano e capire le potenzialità di questo sistema di programmazione.

ACCESSO A ENTITA E DATI DI HOME ASSISTANT ED MQTT:

Se guardate la “palette” a sinistra della schermata di NodeRed dovreste avere un gruppo di nodi denominati “Home Assistant” e questi vi consentiranno di interagire con le entità ed i loro valori; altri nodi fondamentali sono quelli relativi a MQTT, che vi consentiranno di eseguire dei flow quando riceverete un messaggio in un determinato topic MQTT oppure di pubblicare dei dati/valori su un topic MQTT
I nodi del gruppo Home Assistant dovrebbero già essere configurati per accedere al server se utlizzate HassIO ed avete installato NodeRed come addon seguendo la precedente guida.
Invece per MQTT dovrete configurare l’accesso al vostro broker prima di poter utilizzare i nodi relativi; per fare ciò aggiungiamo un nodo MQTT Input semplicemente trascinandolo dalla palette nell’area di lavoro:

Fatto ciò fate doppio click sul nodo appena aggiunto per editare le sue caratteristiche, al momento ci interessa soltanto configurare il broker in modo da poter da questo momento in poi poterlo utilizzare; questa operazione va fatta soltanto una volta e poi basterà specificare di usare sempre lo stesso broker.
Nella finestra di edit avrete nel campo server la scretta “Add new mqtt-broker…” appunto perché NodeRed non ne trova nessuno definito.

Fate click sull’icona con la matita per configurare l’accesso al broker; innanzitutto date un nome al broker nel campo “Name”, poi nel campo “Server” andrete ad inserire l’IP o URL del vostro broker, la porta di default è 1883 ma se ne utilizzate una diversa cambiatela qui; se avete l’accesso al broker protetto da user a pw (cosa caldamente consigliata) inserite le credenziali nella sezione “Security”; potete lasciare il resto dei parametri di default e cliccate su “ADD” in alto a sinistra per salvare tutto. A questo punto fate click su “DONE” per chiudere la finestra di configurazione del nodo e cancellatelo; non temete i settaggi del broker sono salvati e non avete perso nulla!

ESEMPIO DI FLOW CON HOME ASSISTANT

Vediamo di creare un nostro primo flow utilizzando alcuni dei nodi base ed installando un nuovo nodo.
La nostra automazione dovrà accendere una (o più) luce i giorni feriali (lun/ven) dalle 6:30 alle 8:00 e tutti i giorni dal tramonto a mezzanotte, inoltre (presupponendo di avere un boolean che ci indichi la presenza o meno di qualcuno in casa) vogliamo che questo accada solo se c’è qualcuno in casa.
Ci serviranno i seguenti nodi:

  • current_state (home assistant)
  • call_service (home assistant)
  • switch (funzione di base)
  • light_scheduler (da installare)

Innanzitutto verificate se avete già il nodo light_scheduler, in caso contrario l’installazione è abbastanza semplice, andate nel menù in alto a destra e selezionate “manage palette”

Nella finestra che si aprirà potete vedere in NODES tutti i nodi già installati e quali necessitano di un eventuale upgrade, mentre in INSTALL potete aggiungere nuovi nodi. Selezionate INSTALL e poi digitate nel campo di ricerca “light-scheduler”, se il nodo esiste già nella vostra palette verrà indicato come “installed” (vedi il mio caso) altrimenti avrete un pulsante che vi consentirà di installarlo; attenzione che potreste avere un messaggio di warning che vi avvisa di controllare eventuali “dipendenze” visto che ci sono nodi che prima di essere installati richiedo altri nodi già presenti in NodeRed. Completata la procedura proseguiamo con la creazione del nostro flow.

Inserite i nodi come da immagine qui in basso, come notate non ho ancora fatto alcun collegamento:

Cominciamo a configurare i due light scheduler, il primo controllerà la prima condizione (Lun/Ven dalle 6.30 alle 8.00) e andrà configurato come qui in basso, per selezionare quando vorrete attivare lo scheduler basta selezionare con il mouse nel “calendario” settimanale in maniera alquanto semplice ed intuitiva, nel messaggio di On/Off Payload mettiamo ON e OFF (o quel che preferite) e selezioniamo Output = “when state changes + startup” così da generare un evento sia quando cambia lo stato che allo start di NodeRed; infine se volete introdurre un po’ di effetto “random” potrete specificarlo nel campo “Randomness (in minutes)”, ad esempio inserendo 10 il comando verrà randomizzato di +/- 10 minuti, e questo vale sia per accensione che spegnimento; finito tutto chiudiamo salvando il nodo; dimenticavo che è bene dare un nome esplicativo ai nodi in modo da rendere più chiaro la loro funzione senza doverli aprire (io infatti ho messo “Accensione Le-Ve dalle 6.30 alle 8.00”; infine il campo Globals va definito con le vostre geocoordinate (operazione da fare solo una volta e che ci servirà per usare Alba e/o Tramonto nella selezione dello scheduler).

Andiamo al secondo light scheduler che andrà configurato come qui in basso; ho selezionato dalle 17 a mezzanotte nello scheduler ma andando in basso nel campo “Dusk / Dawn” (alba/tramonto) ho selezionato “Only when dark” quindi dopo le 17 e non finchè non fa buio; altra chicca è poter selezionare il “threshold” ossia come considerare “buio” basato sull’altezza del sole all’orizzonte, se volete più dettagli google è il vostro amico, io ho scelto la “Golden Hour” che in pratica è quando il sole + 6° ancora sopra l’orizzonte; al solito diamo un nome e salviamo il nodo (i setting di geolocalizzazione dovrebbero già esser a posto visto che vanno fatti solo una volta)

A questo punto colleghiamo le uscite di entrambi i nodi scheduler all’ingresso del nodo SWITCH, questo farà in modo che ogni volta che uno dei due nodi scheduler cambierà stato passando da ON a OFF o vicecersa ed in ogni caso allo startup di NodeRed verrà generato un messaggio ON o OFF dentro la variabile msg.payload e questa verrà “passata” al nodo successivo e cioè lo SWITCH.

Il nodo SWITCH è abbastanza comune poiché consente di effettuare scelte multiple, anche abbastanza complesse sul valore che riceve in input e far proseguire il flusso su uno dei suoi output (si al momento ne vedete solo uno ma seguitemi e capirete); apriamo il nodo switch con un doppio click e vediamo come funziona.

Questo nodo è comparabile ad un IF-THEN multiplo; in pratica nel primo campo di ogni riga (e ne potete avere anche più di due ovviamente) selezionate la condizione, nel nostro caso vogliamo un match esatto quindi “==” ma come vedete dall’immagine le possibilità sono parecchie, e poi diciamo che la comparazione va fatta come stringa alfanumerica (ma potete usare numeri, stringhe, espressioni JSON, variabili esterne, etc.) ed va confrontata con il valore “ON”; se questa condizione è vera il flusso proseguirà verso l’output numero 1; identica cosa con la riga successiva soltanto che questa volta confrontiamo con il valore “OFF” e se la condizione è vera proseguiremo verso l’ouput 2. In questo caso io sono sicuro di avere solo queste due possibilità (vedi nodi precedenti) ma potremmo mettere una terza linea con condizione “otherwise” che in pratica sarà un ELSE e cioè sarà vera se nessuna delle condizioni precedenti è vera.

Se avete fatto tutto correttamente vedrete che il nodo switch adesso avrà due output, il primo si attiverà quando il messaggio in ingresso sarà uguale ad “ON” mentre il secondo quando sarà uguale a “OFF”; colleghiamo quindi il primo output al nodo “Current State” mentre il secondo output al nodo “Call Service” in basso, infine colleghiamo l’output del nodo “Current State” all’input del nodo “Call Service” in alto:

Completiamo prima il flow per lo spegnimento delle luci, facciamo doppio click sul nodo “call service” in basso per aprire il suo contenuto; qua dovreste cominciare a vedere qualcosa di familiare in quanto questo nodo non fa che richiamare un servizio su Home Assistan; nel mio caso l’ho chiamato “Spegni Lampade Salotto”, il domain è ovviamente “lights”, il servizio che voglio richiamare è “turn_off” e nel campo Entity ID metto una o più entità luci a cui mandare il comando; se volete settare altri parametri allora usate il campo “Data” dove poter inserire un JSON completo con il quale ad esempio settare una certa luminosità o un certo colore.

A questo punto, come potete ben immaginare, per l’altro nodo Call Service potete procedere in maniera identica al precedente con la differenza che dovrete richiamare il servizio “turn_on” questa volta.

Abbiamo quasi finito e questo ultimo passo è un secondo controllo che ho inserito solo nel caso si debbano accendere le luci ossia quando lo scheduler crea un comando “ON” e che nel caso di spegnimento non è necessario. Per introdurre questa condizione secondaria utilizziamo un nodo “Current State” che in pratica non fa che analizzare lo stato di un’entità di home assistant e prendere una certa decisione a seconda.

Facciamo doppio click su questo nodo per vedere come configurarlo; innanzitutto gli diamo un nome per capire sempre che controllo esegue, nel mio caso l’ho chiamato “qualcuno in casa?”, poi dobbiamo specificare quale entità vogliamo analizzare nel campo Entity ID e la condizione nel campo “If State”;  in pratica se la condizione che avete impostato è vera allora il flusso proseguirà verso il primo output di questo nodo, viceversa a condizione falsa il flusso proseguirà verso il secondo output; nel caso in oggetto se il boolean è OFF (cioè in casa non c’è nessuno) il flusso si interromperà dal momento che come vedrete in seguito non collegheremo nulla al secondo output, quindi questa condizione si legge come “prosegui se il boolean è ON, altrimenti fermati”

Completato tutto dovreste avere una situazione come questa in basso.

Come ricorderete i nodi con il pallino blu indicano quelli che sono stati aggiunti o modificati e che non sono ancora stati resi effettivi sul server; per finire e rendere attiva la nostra automazione facciamo click sul tasto rosso “DEPLOY” in alto a destra.

Abbiamo completato il nostro flusso e dovreste notare che sotto alcuni dei nodi sono apparse delle scritte e/o pallini colorati; questo è lo status che ci aiuta a capire cosa sta succedendo, ad esempio lo scheduler ci dovrebbe far vedere se si trova in una situazione di ON o OFF, il nodo call service ci farà vedere l’ultima volta che è stato richiamato e così via; vedremo che altri nodi avranno il loro status specifico e, in futuro, quando scriveremo noi il codice di un nodo in Javascript potremo visualizzarne lo status con le informazioni che riterremo più utili.

Non vi rimane che testare il vostro flusso che dovrebbe attivarsi negli orari selezionati e disattivarsi al di fuori di essi; se non volete gestire la condizione di controllo presenze potete sempre togliere quel nodo e collegare direttamente l’output dello switch al call service per accendere le luci o potete inserire altre condizioni a seconda di cosa volete ottenere.

Spero di non esser stato troppo lungo ma volevo fin da subito proporre un esempio mediamente complesso con controlli multipli per mostrarvi quanto sia più semplice creare automazioni del genere rispetto a scriverle in YAML; e non dimenticate che con NodeRed non serve riavviare nulla, non appena avrete fatto il deploy dei vostri flows essi saranno subito attivi ed utilizzabili in Home Assistant.

Se volete specifici argomenti, flussi o automazioni trattati nei prossimi tutorial lasciate pure un messaggio qui, se invece avete dubbi, domande o non riuscite a far funzionare qualcosa relativa a NodeRed vi invito a chiedere sul canale telegram oppure aprire un thread nel forum.

Buon lavoro e al prossimo articolo!

 

4 risposte

  1. Thomas ha detto:

    Complimenti per la guida!!!

  2. Beniamino Ghiani ha detto:

    Complimenti per la spiegazione, tutto chiarissimo, funziona al primo colpo.

  3. Marco ha detto:

    Grazie per la guida chiara ed esaustiva !

  4. Marco ha detto:

    E se volessi trasferire un valore di una temperatura che varia nel tempo da nodered a ha ? Grazie e complimenti per la tua super spiegazione!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Advertisment ad adsense adlogger