ESP8266 e Telegram: Bot.. da orbi!

Ho acquistato la scheda in foto non tanto in vista di un utilizzo reale ma allo scopo di giocare un po' con la programmazione dell'ESP-12F montato a bordo. Sui siti e-commerce si trova a meno del costo dei soli relè, dunque ho ceduto alla tentazione. All'arrivo era caricato un firmware di test che accendeva in sequenza le otto uscite. Carino il ticchettio, almeno per i primi 5 secondi.. constatato che almeno i relè funzionavano tutti, sono passato alla fase successiva, la programmazione.
Dopo una breve ricerca sono capitato in questa pagina: https://werner.rothschopf.net/microcontroller/202108_esp8266_esp12f_relay_x8_en.htm che utilizza una interfaccia utente html basata sulla libreria esp_webserver_generic. Caricata e testata: gradevole nell'aspetto grafico, pienamente funzionante. MA...
Come mio solito, cerco di metterci del mio, dunque la traduzione in italiano delle pagine web non poteva bastare. Ho pensato che, tramite un bot Telegram (già utilizzato in passato nel progetto WiFi DataLogger ) avrei avuto accesso alla scheda direttamente dai miei dispositivi, anche fuori dalla rete casalinga, senza problemi di dns, port forwarding, VPN e amenità varie. Del progetto originale ho comunque mantenuto le funzionalità di aggiornamento del firmware in modalità OTA (cioè tramite WiFi), dal momento che per la prima programmazione è necessario utilizzare un convertitore USB-seriale (TTL a 3.3V) e collegare i segnali RXD, TXD e GND ai pin TXD, RXD e GND del connettore a bordo scheda, oltre che connettere a massa il pin GPIO0 prima di alimentare la scheda per attivare il modo programmazione dell'ESP12. Viste le finalità dell'acquisto (e la pigrizia!) mi è sembrata, e si è dimostrata, un'ottima idea.

All'opera

Ho iniziato da zero o quasi, ovvero dallo sketch di esempio della libreria UniversalTelegramBot opportunamente installata nella IDE di Arduino, ed ho implementato la gestione di accensione e spegnimento dei vari relè tramite comandi tipo "/31" (relè 3, accendi) ed il rispettivo "/30" (relè 3, spegni) e così via per le otto uscite, oltre alla funzione che invia in risposta ad ogni comando lo stato delle stesse. Allo stesso modo ho istruito BotFather per riconoscere gli stessi comandi, più un comando di spegnimento contemporaneo di tutte le uscite attive ed uno "a salve" solo per visualizzare lo stato dei relè. Carico e via di test..
Tutto funzionante, sia in copertura del wifi di casa che dal telefonino via internet. Bene dunque, ma la chat testuale certo non brilla per estetica. Ho pensato di sostituire la risposta testuale del bot con delle emoji, quelle in particolare con i numeri incorniciati indicanti i relè, ed i simboli "spunta verde" per le uscite attive e "X rossa" per quelle inattive. Ma come inserirle nel testo di risposta generato dal bot? Ho scoperto che la stessa emoji può essere selezionata con codici diversi, ad esempio :three: per il numero tre. Modifico lo sketch e provo. Nulla, il testo viene inviato "in chiaro" dunque niente iconcine. Mi imbatto in questa pagina: https://apps.timwhitlock.info/emoji/tables/unicode che è stata illuminante. Per ogni emoji vengono indicati i codici "Unicode" e "Bytes", ad esempio per il numero 5 valgono rispettivamente U+0035 U+20E3 e \x35\xE2\x83\xA3. Ma come utilizzarli? Scopro che i codici Unicode vanno "digeriti" da funzioni apposite e in alcuni esempi occorre appoggiarsi a linguaggi (python) o server esterni, mentre i famigerati Bytes altro non sono che codici esadecimali UTF-8, dunque assegnabili a caratteri di una stringa di testo al pari di qualsiasi codice ASCII. Bingo! Dunque scarto le opzioni Unicode, python, MQTT, IFTTT et similia; converto i codici esadecimali in decimali così da utilizzare la funzione char() dell' Arduino-C e completo lo sketch. Compilo, carico... Adesso si ragiona! esattamente quello che avevo in mente. Certo l'interfaccia rimane frugale, ma quel tocco di grafica la rende più gradevole.

Addendum

Ecco che ci risiamo, l'appetito vien mangiando, come al solito. Tanto per cominciare ho ristretto il riconoscimento dei comandi da parte del bot tramite un filtro basato sull'ID univoco associato al mio profilo. Lo si recupera tramite il bot IDBot (!) al quale inviare il comando /getid, oppure lasciando collegato alla scheda il convertitore USB/TTL e attivando il monitor seriale dalla IDE di Ardiono. Nel codice ho infatti previsto di inviare alla seriale ID e nome utente. Eventuali altri utenti ricevono in risposta un messaggio di accesso negato. Un ulteriore controllo verifica che il comando ricevuto sia valido, in caso contrario invia un apposito messaggio di avviso.
E se volessi abilitare anche amici/familiari? Certo se il numero è contenuto è possibile inserire ulteriori ID nello sketch, ma ad ogni modifica occorre ricompilare e riprogrammare l'ESP. Dunque cambio approccio: creo un gruppo telegram privato al quale aggiungo gli utenti che mi interessano, abilito nel codice dello sketch me stesso e il gruppo ed ecco fatto. Le caratteristiche (finora) implementate sono:

E se... volessi gestire più di una scheda? Dal cassetto "Spare parts" ho recuperato una scheda NodeMCU che tengo di scorta per il WiFi DataLogger e ci ho caricato -paro paro- il firmware di questo progetto, senza collegarvi i relè esterni. In questo caso è possibile usare un cavetto USB sia per l'alimentazione che per la programmazione dunque non serve il convertitore USB-TTL. Ho quindi creato un secondo bot con le stesse impostazioni e l'ho aggiunto al gruppo degli utenti abilitati. Attivando dalla chat del gruppo il pulsante dei comandi viene proposta una lista con accanto al comando l'icona del bot a cui fa riferimento, per cui la gestione di più schede è senz'altro fattibile e devo dire anche piuttosto funzionale. Mica male davvero.

Tirando le somme

Materiale occorrente:

  1. La scheda con 8 relè ed il ESP-12F della foto, oppure altra basata su ESP8266
  2. Un PC con IDE arduino

1. Configurazione di Arduino IDE

Sinteticamente: partendo da una installazione "pulita" della IDE, occorre aggiungere l'indirizzo url http://arduino.esp8266.com/stable/package_esp8266com_index.json nella finestra richiamata tramite il menu File - Preferenze.

Successivamente tramite il menu Strumenti - Scheda "..." - ESP8266 Boards sarà possibile scegliere il modulo NodeMCU 1.0 (ESP12-E). Nel mio caso la scheda monta un 12-F ma non ho avuto alcun problema.

Per quanto riguarda le librerie, tramite il menu Strumenti - gestione librerie occorre selezionare esp8266 by ESP8266 Community e UniversalTelegramBot.

2. Collegamenti alla scheda relè

Nello schema sono riportati i collegamenti fra l'ESP-12 e il convertitore seriale USB-TTL necessario per caricare il firmware. Nel caso venga utilizzata una scheda diversa dalla mia, magari costruita ad hoc attorno all'ESP "nudo", occorre seguire questa configurazione.

Nel mio caso in fase di ingegnerizzazione è stato previsto un apposito connettore a pettine con tutti i segnali necessari, oltre ad un pulsante di reset che rende superfluo l'utilizzo del segnale DTR dello schema.

Alimentando la scheda con una fonte di alimentazione dedicata (5 volt stabilizzati o 7-20 volt non stabilizzati tramite la apposita morsettiera) non resta che collegare:

  • il pin GND della scheda con il corrispondente GND del convertitore;
  • il pin RXD della scheda con il TXD del convertitore;
  • il pin TXD della scheda con il RXD del convertitore.
Il pin IO0 della scheda va posto a massa durante l'accensione per attivare la modalità programmazione dell'ESP; nell'uso normale va lasciato aperto. Questa procedura è indispensabile per il primo caricamento del firmware; per eventuali successive riprogrammazioni è possibile utilizzare la funzionalità OTA selezionando tramite il menu Strumenti - Porta la porta ESPxxxx+numeroIP che sarà "magicamente" apparsa nel frattempo.
3. Creazione Bot e gruppo utenti

 

   

Incredibile. Per creare un bot ci si serve di.. un bot, per la precisione BotFather. Al comando /start restituisce i comandi disponibili, eviterò lo "spiegone" di come utilizzarlo dal momento che in rete ci sono tutorial validissimi in grado di aiutare a configurare il tutto.

Ho quindi creato due bot, uno per la scheda relè e un secondo a fini di test per la NodeMCU; assegnato loro un nome, una descrizione, una immagine, inserito la lista dei comandi. Ho quindi creato i token, cioè i codici da copiare nello sketch di Arduino, e attivato le opzioni /setinline e /setjoingroups in vista dell'utilizzo tramite il gruppo utenti.

Questo può essere creato direttamente dal proprio profilo; assegnato un nome e una immagine sarà possibile aggiungere gli utenti ai quali concedere il controllo della/delle schede.

4. Compilazione del firmware

Prima di caricare il firmware sulla scheda occorre compilare con i valori corretti le definizioni WIFI_SSID, WIFI_PASSWORD e BOT_TOKEN per permettere il collegamento alla rete wifi casalinga e al bot di Telegram.

Se si conoscono già gli ID del proprio profilo e del gruppo utenti si possono inserire nella riga apposita della funzione handleNewMessages; in caso contrario si possono recuperare tramite il bot IDbot oppure in un secondo momento, lasciando in prima battuta i valori fasulli.

Una volta caricato il firmware, tolto il collegamento a massa di GPIO0 e resettato il circuito, tramite il monitor seriale della IDE o altro terminale RS232 dovremmo vedere la sequenza di avvio dell'ESP ed il collegamento al wifi. Quindi, da Telegram, inviando al bot un testo qualunque dal proprio account e dal gruppo, avremo come risposta un messaggio di errore, ma leggeremo gli ID richiesti a video.

A questo punto basta inserire i valori ottenuti nello sketch, ricompilare e ricaricare, magari tramite OTA. Lavoro concluso, non resta che verificare il buon funzionamento delle varie funzioni. Pensiero del giorno: il gruppo è privato, gli ID filtrati... in ogni caso meglio accendere e spegnere le luci di casa, il presepe o l'insegna del negozio, per l'apriporta di casa o del garage meglio pensare a qualcos'altro.

Nello sketch i relè sono comandati ON/OFF come interruttori, va da sè che per esigenze specifiche possono essere gestiti in modo diverso, es. a coppie, temporizzati eccetera... come si conviene per qualunque progetto basato su microcontroller programmabili.

5. Vai di IOT

     

Ultimate le "fatiche" elettronico-informatiche (poco o nulla le elettroniche, 6-- per quelle informatiche), in attesa di ispirazione per una collocazione pratica dell'accrocchio, occorre un contenitore opportuno che possa alloggiare scheda, alimentatore e prese per gli utilizzatori. Per non schermare il segnale wifi credo che metterò tutto quanto dentro un centralino da esterno in resina plastica, montando sia il trasformatore di alimentazione che le prese su guida DIN. Tipo questo:

Con un mix di prese da 10A e schuko calcolato per occupare tutti i 24 moduli ed etichettate a dovere il risultato dovrebbe essere ottimale.

praz2004 chiocciola libero punto it