o n i " C i vi t a
a rc v
IS G. Marcon
ec
M
· II S "
ch i
a·
Tec
o
fic
ni
ti
o n
ie
c
e L
iceo Sc
Sebastiano Melita
1 Node-red 1
2 Bot 2
3 Tempistica dei Flow 3
4 Flows del progetto 4
5 Flow di impostazione 6
6 Flow di comando 7
Richard Stallman
• I nodi connettori possono fornire una gestione diretta del mezzo fisico (livello 1
OSI), cioè comunicare con i GPIO e i transceiver (RS232, RS485, ecc.), realizzando a
livello superiore (livello 2 pila OSI) i protocolli di arbitraggio più disparati (Profibus,
Modbus, ecc);
2 1 . node - r e d
2 b ot
Ma quando è eseguita questa funzione? Tutte le volte che il nodo viene triggerato,
cioè quando su un suo ingresso arriva un nuovo messaggio.
In pratica un nodo è assimilabile a una funzione javascript che viene chiamata
all’arrivo di un messaggio. Viene cioè implementato una sorta di interrupt di alto
livello che esegue una funzione alla notifica di un nuovo messaggio all’ingresso
di un nodo. È chiaramente una gestione ad eventi che è molto ben supportata dal
sottostante linguaggio node.js per il quale ogni azione sul computer (apertura di
un file, inserimento di un carattere, ecc.) è di fatto nativamente un evento.
Gli eventi non si possono gestire all’interno del codice in maniera sincrona (cioè
prevedibile) a priori come in una normale chiamata di funzione (precisamente
localizzata all’interno del codice e quindi dalla tempistica nota), ma, per forza di
cose, in maniera asincrona. node-red unifica tutta la gamma dei possibili eventi
possibili in un unico evento parametrizzato: l’arrivo di un messaggio.
La particolarità di Node.js (e quindi di node-red) è quella di gestire chiamate di
funzione asincrone in un ambiente di esecuzione rigorosamente single-threaded.
La catena delle varie esecuzioni procede dal primo all’ultimo nodo ma può essere
commutata da un flow all’altro, per mezzo di nodi switch, od oppure filtrata, cioè,
propagata o meno, in base al valore di determinati campi del messaggio.
• Il primo restituisce alla chat telegram, a seguito cella ricezione del comando
/scenario1, la tastiera di configurazione dello scenario richiesto.
• Il secondo interpreta i messaggi sulla chat del Bot alla ricerca di comandi di
attivazione o disattivazione di un relè.
4. flows de l p ro g e t t o 5
L’impostazione del Bot (vedi fig. 4.3b) imposta il token per il diritto di accesso al
Bot e, più in basso, anche l’elenco delle chat_id delle chat telegram autorizzate ad
inviare messaggi al Bot. I messaggi con chat_id non presente in elenco verranno
scartati.
6 4 . f l ows de l p ro g e t t o
5 f low di impostazione
Una assegnazione è richiesta per tradurre il parametro chat_id che, pur avendo
uguale significato, ha nome diverso nelle due API che andiamo ad usare, quella di
ricezione che fa l’aggiornamento dei contenuti di una chat e quella di trasmissione
che esegue il metodo sendMessage sul nodo che pubblica i contenuti sul Bot.
Il metodo di classe JSON.stringify(obj) ha per argomento un riferimento ad
un oggetto creato inline, cioè direttamente come argomento di una funzione, e
restituisce la sua rappresentazione sotto forma di stringa. Viene usato per creare il
valore del campo reply_markup che deve essere di tipo stringa.
In genere le stringhe sono, assieme ai byte, i soli formati per i dati utilizza-
bili per le trasmissioni di tipo seriale che sono tipicamente usate sui canali di
comunicazione. In un momento successivo, in ricezione, viene effettuata l’operazio-
ne contraria di parallelizzazione ricostruendo l’oggetto originale per mezzo della
funzione JSON.stringify(obj).
Dobbiamo adesso utilizzare il sender di Tele-
gram. In libreria ce ne è già uno pronto all’uso che
però al momento è inutilizzabile probabilmente
perché sono state recentemente aggiornate le API
del metodo sendMessage. Figura 5.5. http request.
È l’occasione per crearne uno nostro a partire
dal nodo generico http request che è, più in generale, in grado di interfacciarsi con
qualunque api rest http.
Il nodo può lavorare in modalità get o post a seconda del tipo di richiesta
http. Nel nostro caso le API del metodo richiedono parametri di tipo post che
devono essere forniti come messaggio in ingresso e verranno inseriti nel corpo del
messaggio http in uscita.
In un campo del form del metodo deve poi essere inserito l’URL https della
richiesta. Consultando la documentazione delle API di Telegram ricaviamo che la
struttura deve essere:
https://api.telegram.org/bot<bot_id>:<token>/sendMessage
6 f low di comando
Questo flow serve a gestire le richieste di apertura e chiusura del relè provenienti
da una chat Telegram. Ogni nodo Telegram di base esegue una particolare richiesta
di servizio richiamando una API di rete (webservices rest http) pubblicata sul
server Telegram.
La risposta all’arrivo di un messaggio può essere valutata con un nodo di debug
che restituisce:
8 6 . f l ow di c om a n d o
msg.payload : Object
{chatId: 256332767, messageId: 1158, type:"message", content: "1_ON"}
Il flusso delle operazioni è:
This work is licensed under the Creative Commons Attribution 3.0. To view a copy of this
license, visit
http://creativecommons.org/licenses/by-nc-nd/3.0/
or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, Cali-
fornia, 94041, USA.