martedì 25 agosto 2020

Tasmota - Integrazione con Telegram

 


Ci sono alcuni passaggi da fare, ma è possibile fare una chat Telegram con un dispositivo con Tasmota a bordo, vediamo come!

Telegram e Tasmota? Si!

Telegram è una piattaforma di chat nota (tra le altre cose) per i suoi bot, ovvero dei programmi che rispondono agli input dell'utente. Tasmota è un firmware per dispositivi IoT che dialogano con l'utente.
Il merge era auspicabile, vediamo in questo post tutti i passaggi (in maniera chiara e semplice) per mettere questi due mondi in comunicazione!


Cosa serve lato Tasmota?

Lato Tasmota bisogna compilare il firmware aggiungendo queste due righe :

#define USE_TELEGRAM
#define USE_MQTT_TLS_CA_CERT

Se non sai come compilare il firmware, ti consiglio di fare come me!
Fatti un giro su HassioHelp, hanno un fantastico post intitolato "TasmoCompiler: Compilatore Online di Tasmota"
Io ho seguito la loro guida ed in 5 minuti avevo il firmware pronto, provate!
Dopo aver scaricato il firmware compilato con le due nuove opzioni, ovviamente, lo dovrete caricare su un dispositivo compatibile.
Direi che posso saltare questo passaggio, se sei arrivato qui immagino che tu sappia come fare il flash ad un dispositivo per installare Tasmota.


Cosa serve lato Telegram?

Bisogna creare un Bot, tutto gira attorno a quello. Non è una cosa difficile, anzi, ti aiuto io, basta che segui questi semplici passaggi!

  • Apri Telegram e cerchi l'utenza @BotFather
  • Apri una chat con l'utenza @BotFather e lanci il comando /start
  • Lanci poi il comando /newbot
  • A questo punto ti chiede lo username del tuo bot, ricordati che deve finire con il nome "bot" , quindi potrebbe essere una roba tipo "Tasmota_bot"
Ci sei, hai creato il tuo Bot!
Visto che era semplice e veloce?

BotFather a questo punto ti lascia un token alfanumerico, copia e salva questa chiave.
Potrebbe essere una cosa tipo questa :

9547231494:AAHzi--ik51GedFg45T8QLX4bbyNZni-MGc

Mi raccomando, salva questa stringa perchè ti servirà per Tasmota!

Ora ti colleghi a 

https://api.telegram.com/botXXXXXX/getMe

ed al posto di XXXXX ci metti il token.  Non dimenticarti la parte /getMe finale!
Se vuoi, funziona anche con https://api.telegram.org
Sarà quindi una cosa simile :

https://api.telegram.com/bot9547231494:AAHzi--ik51GedFg45T8QLX4bbyNZni-MGc/getMe

Lanci questo link e l'API ti risponde con una stringa visualizzata su una pagina web.
Adesso lanci questo link :

https://api.telegram.com/botXXXXXX/getupdates

ed al posto di XXXXX ci metti nuovamente il token . Non dimenticarti la parte /getupdates finale! Il tuo link quindi sarà circa così :

https://api.telegram.com/bot9547231494:AAHzi--ik51GedFg45T8QLX4bbyNZni-MGc/getupdates

Lanci questo link e l'API ti risponde con una stringa.
Adesso su Telegram apri un gruppo ed inviti l'utente bot che hai creato, lo trovi con la @ davanti al nome scelto.
Nel nostro caso sarà @Tasmota_bot, lo aggiungi lanciando il comando 

/join @Tasmota_Bot

A questo punto lanci nuovamente il secondo link , ovvero 

https://api.telegram.com/bot9547231494:AAHzi--ik51GedFg45T8QLX4bbyNZni-MGc/getupdates 

Nella risposta che ti arriva, cerchi il valore "chat":("id":-1111111111)

Salvati questa stringa numerica perchè è la ChatId , ovvero la chat che farai con il tuo bot!
Nel caso in esempio, il ChatID è 351671341



Come aprire un dialogo tra Tasmota e Telegram

Ora che hai il bot, il token ed il Chat Id, ci sei quasi!

Apri una console di Tasmota e digiti :

TmToken 9547231494:AAHzi--ik51GedFg45T8QLX4bbyNZni-MGc

Ecco cosa succede in console:

11:49:19 CMD: TmToken 9547231494:AAHzi--ik51GedFg45T8QLX4bbyNZni-MGc
11:49:19 RSL: RESULT = {"TmToken":"9547231494:AAHzi--ik51GedFg45T8QLX4bbyNZni-MGc"}

Ok, adesso devi inserire il ChatId con questo comando :

TmChatId 351671341

Ecco cosa succede in console:

11:49:26 CMD: TmChatId 351671341
11:49:26 RSL: RESULT = {"TmChatId":"351671341"}


Ok, ci siamo, mancano ancora un paio di passaggi!

Lancia adesso il comando TmState 5
Questo comando abilita l'echo locale di quanto viene mandato dal bot.
La risposta di Tasmota è la seguente :

11:28:14 CMD: TmState 5
11:28:14 RSL: RESULT = {"TmState":{"Send":"OFF","Receive":"OFF","Echo":"ON"}}
11:28:14 TGM: Started

Dopo circa 1 minuto si noterà sul Bot che viene lanciato il comando /start
Se non succede, non ti preoccupare, vuol dire che il tuo bot è già stato avviato.
Adesso bisogna levare l'echo locale del bot, basta lanciare TmState4 :

11:30:43 CMD: TmState 4
11:30:43 RSL: RESULT = {"TmState":{"Send":"OFF","Receive":"OFF","Echo":"OFF"}}

Ci siamo quasi, penultimo passaggio!Adesso bisogna lanciare il comando TmState 1

11:33:15 CMD: TmState 1
11:33:15 RSL: RESULT = {"TmState":{"Send":"ON","Receive":"OFF","Echo":"OFF"}}

Per inviare un comando da Tasmota a Telegram, basta lanciare il comando TmSend seguito dal testo che si vuole mostrare :

TmSend Prova invio da Tasmota

11:50:28 CMD: TmSend Prova invio da Tasmota
11:50:29 RSL: RESULT = {"TmSend":"Done"}



Direi che è andata a buon fine!


Alziamo un pochino l'asticella, riceviamo comandi da Telegram su Tasmota!

EDIT:

Dall'utente mosix76 è stato rilevato che 
 i comandi inviati da telegram vengono ricevuti solo se preceduti dal carattere "/". Es: "/power on", "/power off", "/quellochevuoi"
Evidentemente lui ha una release più aggiornata della mia e qualcosa è cambiato.

Comunque, la possibilità di ricevere comandi è prevista, lanciando il comando della console Tasmota Tmstate 3

11:36:36 CMD: tmstate 3
11:36:36 RSL: RESULT = {"TmState":{"Send":"ON","Receive":"ON","Echo":"OFF"}}

Ora, nella chat con il nostro bot scriviamo Power On



Ed anche questo è andato a buon fine!

Ma se volessimo lanciare tipo un comando di stato?
Basta scrivere nella chat Telegram "status 5", per esempio, ed ecco il risultato :



Direi semplicemente perfetto!!!


Nota: 

Se ti pare che ci mettano troppo tempo i comandi da Tasmota a Telegram e viceversa, puoi modificare il valore.
Basta lanciare il comando TmPoll seguito da un numero di secondi a tuo piacimento. Non sono accettati valori inferiori ai 4 secondi nè superiori a 300 secondi.



Conclusioni

Con un pochino di sbattimento (ma è più lo scriverlo che il farlo) abbiamo messo in comunicazione Tasmota e Telegram, direi quindi che la cosa è andata a buon fine!
Come sempre, l'ottimo Theo ha implementato una cosa davvero utile in Tasmota!

Per ora il supporto non è inserito ufficialmente nella Wiki, sono passati circa 2 mesi dall'implementazione.

NOTA : 
Tieni presente che tutti i parametri TmState non sono persistenti in memoria, quindi ad ogni riavvio sono da ripassare.
Questo potrebbe essere un lavoro per le Rule, ma ne parleremo più avanti...
Per ora, la soluzione grezza e veloce è lanciare questo comando :

backlog tmstate 5; tmstate 4; tmstate 1; tmstate 3

Spero che questo post ti sia piaciuto e che ti sia servito, se vuoi leggere altro a tema Tasmota, ho raccolto qui tutti i post che ne parlano!

Se non riesci a fare qualcosa di quanto scritto sopra, lascia un messaggio e ti darò volentieri una mano, vedrai che con un pochino di aiuto ci riuscirai!

Tasmota_telegram_integration
Come interfacciare Tasmota con Telegram, in pochi e semplici passaggi!



21 commenti:

  1. Ciao Mino,
    grazie per il preziosissimo tutorial, visto che ancora oggi l'interfacciamento con telegram non risulta ancora documentato ufficialmente credo.
    Ho seguito le tue istruzioni, e riesco a mandare messaggi dalla console di tasmota sul sonoff, alla chat di gruppo su telegram. Ma se provo a fare il contrario (inviare comandi da telegram a tasmota), il sonoff non riceve alcun messaggio.
    Qualche consiglio?

    RispondiElimina
    Risposte
    1. Ciao Mosix76, mille grazie a te per essere passato da qui! Faccio delle domande sceme, ma vediamo se possiamo escludere le problematiche più comuni,ok?

      Hai provato a lanciare da console il comando tmstate senza parametri? dovresti vedere i 3 stati di send, receive e local echo.
      dovrebbe essere ON il valore di Receive, se non lo fosse, lancia il comando tmstate 3.

      Guarda anche se tmpool non è ad un valore enorme, lo avevo a a 4 secondi che è il minimo impostabile, ma talvolta non girava quindi lo ho messo a 8 secondi e non sbaglia un colpo.

      Ricorda che tmstate non è persistente in memoria, quindi ad ogni reboot (o distacco dalla 220v) vengono persi...

      Al momento non mi viene in mente altro, fammi sapere se hai risolto!

      Elimina
  2. Ciao Mino,
    grazie per avermi risposto, ho risolto proprio stanotte. Se dovesse capitare a qualcunaltro, qui ho trovato la soluzione: https://github.com/arendst/Tasmota/issues/8619#issuecomment-711094057

    RispondiElimina
    Risposte
    1. ciao Mosix76, grazie a te per il feedback, appena possibile provvedo ad aggiornare l'articolo, sperabilmente entro domani sera sarà aggiornato con il warining relativo a non ricevere messaggi se ci sono messaggi unread in coda.

      Elimina
  3. Nel mio caso non e' stato sufficiente svuotare la coda. Ho scoperto che i comandi inviati da telegram vengono ricevuti solo se preceduti dal carattere "/". Es: "/power on", "/power off", "/quellochevuoi", etc.

    Mentre ci sei, se puoi, sostituisci "telegram.com" con telegram.org".

    Mie considerazioni: Mi chiedo perche non possa messaggiare direttamente col bot, piuttosto che passare per una chat di gruppo. Se ho n bot, devo creare n chat, per non mandare lo stesso comando a tutti, senza dovermi studiare qualche filtro con le rules?

    Grazie ancora, cmq sono molto contento del traguardo che ho raggiunto grazie alle tue istruzioni. Ho inserito il tuo blog fra i miei preferiti, per controllarlo ogni giorno. A presto

    RispondiElimina
    Risposte
    1. uppo... ci ho sbattuto la testa 3 giorni

      Elimina
    2. Sinceramente non so perchè sia stato strutturato in questo modo, ma questi sono gli strumenti messi a disposizione da Tasmota. Ora è un pò che non mi ci dedico, magari con la nuova release è stato migliorato qualcosa, ma non mi pare di aver visto nulla nei changelog...

      Elimina
  4. Mi sono baloccato per un pochino di tempo con il discorso della chat di gruppo che coinvolge il singolo bot. In linea di massima ha senso il desiderata di avere più bot con i quali messaggiare direttamente, ma credo che la limitazione sia voluta.
    Non dimentichiamoci che di base Tasmota nasce per i Sonoff che hanno un footprint di memoria decisamente piccolo.
    Magari un altro firmware che non è così intimamente legato ai Sonoff ha un pipe verso Telegram migliore...
    Ipotizzo, sia chiato, ma a naso direi che sono nella direzione giusta.

    RispondiElimina
  5. Ciao, ho torovato molto istruttivo questo post, grazie.
    Tuttavia anche se ho cercato di seguire alla lettera i passaggi, non mi funziona la comunicazione tra chat-bot-tasmota.
    Ho compilato usando PlatformIO, togliendo dal file di config il commento agli include che hai scritto nella guida, creato il bot, fatto tutti i passaggi, settati sia il tmchatid che il tmtoken, dato il permesso di leggere i messaggi e di inviarli con tmstate 1 3, ma cmq se scrivo nella chat di gruppo, i comandi non arrivano e viceversa, anzi mi viene restituito un errore: RSL: RESULT = {"TmSend":"Failed"}
    Sicuramente sto sbagliando qualche cosa, ho ricontrollato i passaggi e cercato sia su google che nelle issue del repo ufficiale.

    RispondiElimina
    Risposte
    1. Cavolo, mi ero perso il tuo messaggio, scusa!!! Potresti poi dirmi come hai risolto che magari qualcuno ha/avrà il tuo stesso problema?

      Elimina
    2. Ciao, vedendo che non rivevevo risposte, ho smesso di controllare questa pagina.
      Dunque, io ho in parte risolto ricompilando come hai detto tu, ma cambiando il fingerprint
      #define USE_TELEGRAM_FINGERPRINT "\xF2\xAD\x29\x9C\x34\x48\xDD\x8D\xF4\xCF\x52\x32\xF6\x57\x33\x68\x2E\x81\xC1\x90"
      Sinceramente non so se sia corretto o meno, ma così a me funziona.
      Ora sorge un altro problema. Sembra che il bot a volte si "intasi" e non risponda più.
      Sto cercando di capire come risolvere la cosa.
      Con un bot funzionante, getUpdates mi restituisce {"ok":true,"result":[]}
      Mentre con un bot "intasato", ricevo tutti i messaggi in coda.
      Al momento non ho idea di come "stasare" la coda.
      Siccome non mi arrivano le notifiche, mi potete trovare su telegram @zeldo

      Elimina
    3. Mai provat a cambiare il fingerprint, la settimana prossima ci gioco un pochino! Grazie mille!

      Elimina
  6. Buonasera, purtroppo ho già provato 4-5 volte, ma mi fermo al punto in cui provo a mandare un messaggio dal Tasmota a Telegram.
    Credo di aver avuto lo stesso problema dell'ultimo utente qui sopra.
    Infatti, anche quando mando il primo TmState 5, non sempre mi appare la scritta TGM: Started nella console di tasmota.
    Consigli su come procedere? Forse sbaglio nella creazione del gruppo con il bot?
    Grazie!

    RispondiElimina
  7. Ciao, il bello è che tutti cercano soluzioni, ma non condividono il risultato...
    Amen, andiamo avanti!
    Mi interessa il discorso che "non sempre" ti risponde Tasmota con lo start di TGM.
    Se ti succedesse sempre, ti chiederei se hai compilato il firmare includendo #define USE_TELEGRAM e #define USE_MQTT_TLS_CA_CERT.
    Ma se ti accade saltuariamente, sinceramente, non ho idea di come aiutarti.
    Potresti provare ad aprire un ticket sul GitHub di Tasmota, solitamente o Theo o Ascillato rispondono in brevissimo...

    RispondiElimina
  8. Grazie ad un utente che mi ha contattato in pv per questo problema, il problema è stato risolto.
    Se il bot non risponde più, tramite l'url https://api.telegram.org/botXXXXXX/getupdates è possibile vedere se ci sono messaggi in coda. Se il bot funziona e non ci sono messaggi intasati, la risposta è: {"ok":true,"result":[]}
    Viceversa si ha tutto l'elenco dei messaggi.
    Per risolvere è necessario passare a getupdates l'offset dell'ultimo update_id che trovate in elenco ( l'ultimo in ordine crescente )
    es: https://api.telegram.org/botXXXXXX/getupdates?offset=131276872
    In questo modo si "stasa il bot". Perchè questo accada non ne ho idea purtroppo, però così è risolvibile.
    Notare che l'url delle api è cambiato, non è più .com ma .org
    Grazie ancora a questo utente ( penso sia quello che ha scritto il 24 febbraio 2022 ) per avermi aiutato.

    RispondiElimina
    Risposte
    1. Grazie mille Zeldaboch, sempre utile condividere i risultati! Ora vedo se qualche altro membro della community ha avuto i tuoi stessi problemi (ed ha applicato delle soluzioni similari).
      Grazie ancora!

      Elimina
  9. Al momento (v. 11.1.0) TmSend sembra non funzionare più.
    Dove si può trovare la documentazione ufficiale dei comandi TmState e TmSend?

    RispondiElimina
  10. Ciao Fabio, il thread ufficiale è un'issue su Github, nello specifico #8619 , gestita dallo stesso sviluppatore.
    Qui trovi tutto quello che riguarda Telegram :

    https://github.com/arendst/Tasmota/issues/8619

    Spero che ti sia utile!

    RispondiElimina
  11. Perché TmSend funzioni bisogna impostare da console SetOption132 1 come indicato qui: https://github.com/arendst/Tasmota/issues/15505

    RispondiElimina

Sei davvero sicuro di voler sprecare tempo prezioso per scrivere qualcosa? Non è che preferisci andare su Google?

Cerca nel blog

I post più letti di sempre