Problema con Telegram

Buonasera,

posto in questa conversazione anche se è abbandonata da qualche mese perchè anche io ho un problema con l'uso di telegram.
Veloce riassunto, ho una centralina per l'irrigazione sviluppata con un NodeMCU (esp8266). Tra le varie cose usavo la libreria GitHub - witnessmenow/Universal-Arduino-Telegram-Bot: Use Telegram on your Arduino (ESP8266 or Wifi-101 boards) per controllare la centralina da remoto. Tutto ha funzionato correttamente fino a fine 2019 quando a un tratto la connessione al bot ha smesso di funzionare, mi documento e capisco che telegram a cambiato qualcosa a livello di connessione SSL, apparentemente basta aggiornare la libreria esp8266 (io usavo la vecchia 2.4.2) e tutto dovrebbe tornare a funzionare. In realtà la centralina impazzisce (reboot o perdite di connessione) e non funziona nulla. Contattando gli sviluppatori della libreria esp8266 mi viene detto che probabilmente è un problema di memoria, dalla versione 2.5.0 hanno sostituito axTLS con BearSSL che richiede più memoria per gestire una connessione SSL. La presenza contemporanea di una connesione SSL e di un websever sul NodeMCU probabilmente richiede più memoria di quella disponibile (mentre con axTLS la cosa funzionava).
L'autore di Universal-Arduino-Telegram-Bot mi dice che non si può più usare Telegram con axTLS ma a me pare di capire che la libreria sviluppata da @Standardoil forzi proprio per usare axTLS il che potrebbe aiutarmi per risolvere il problema, sarebbe possibile averne una copia? Ringrazio anticipatamente.

--- ho separato il tuo post dalla discussione dove lo avevi messo dato che il problema è differente e quindi deve avere il suo thread. :slight_smile: - gpb01

è pubblica

basta che segui le vecchie discussioni e trovi tutto

comunque il bello delle mie funzioni non è come si connette a telegram
ma che non usa le String

Ho integrato la libreria nel mio codice.
Telegram sembra coesistere con il webserver e il nodemcu non si riavvia e non si disconnette dalla wifi. Probabilmente la libreria che usavo in precedenza usava troppe stringhe.

Ho tuttavia un altro problema. In sostanza il webserver "sembra lentissimo" nel senso che che apro una pagina ci mette una vita per caricarla mentre se disabilito telegram ha una "velocità normale". E' come se l'uso di telegram "impegnasse troppe risorse".

Qualche idea a proposito? Grazie in anticipo.

io qualche idea la avrei anche
ma senza vedere il codice, tutto il codice, non mi esprimo

Ho parlato

OK, appena riesco ad accendere il PC lo posto. Premetto che lo faccio per hobby quindi il codice è tutt'altro che perfetto :slight_smile:

tranquillo, io non critico mai la buona volontà,
ammetto che critico spesso quelli che definisco "carrelli" ovvero gente "vuota" di iniziativa, voglia e conoscenze, ai quali devi "mettere" tutto e ti tocca anche spingerli
ma non mi sembra sia il tuo caso

Mi scuro per il ritardo. Il file del mio progetto si può scaricare da qui (a causa della dimensioni il forum non me lo fa allegare).
Come detto si tratta di una centralina per l'irrigazione che può gestire 2 zone. La configurazione avviene tramite webserver ma l'idea è che si possa controllare anche tramite Telegram.
Non sono esperto di C, anzi l'ho usato le prime volte proprio con Arduino e company, anche se ho già programmato in altri linguaggi. Sono pertanto ben accetti tutti i consigli del caso e non solo quello che può risolvere il problema di rallentamento (quasi impiantato) del webserver se fatto lavorare contemporaneamente a Telegram (a partire da un uso eccessivo di String che mi pare di capire sia da evitare).
La definizione USE_TELEGRAM permette di escludere o meno l'uso di Telegram, le altre 2 definizioni (USE_GBRIDGE, USE_PUSHSAFER) sebbene presenti non sono usate e probabilmente saranno escluse in futuro.

Grazie in anticipo per l'aiuto.

ho dato una rapida occhiata
nessuna critica, io lo avrei fatto differente, ma ognuno è diverso
una domanda: ma non è che interroghi telegram troppo spesso?

alla riga 135 la variabile bot_update_period
e alla riga 139 la variabile bot_frezer_update_period

sembrano messe li per poter interrogare telegram solo a intervalli di 3 secondi ed eventualmente sospenderlo se serve
ma non sono usate da nessuna parte, quindi secondo me tu stai intasando la connessione di chiamate a telegram
ho visto anche un forte uso di oggetti string: sbagliato, mase ti va per adesso il tuo probelam è telegram
purtroppo non ho alcune librerie quindi non posso compilare, ma credo che dovrebbe darti warning in compilazione per indicare variabili inutilizzate

comunque un po' di complimenti te li meriti, hai fatto un lavorone
se invece vuoi delle critiche: non mi permetto per adesso, se ne parla casomai in futuro, quando riesco a girarle in forma di consigli

Intanto grazie per il tempo speso.
In realtà allo stato attuale le 2 variabili che indichi non sono usate. In precedenza quando non usavo la tua libreria ma l'altra che ho dovuto scartare a causa dell'uso eccessivo di memoria pensando che il problema fosse la frequenza di chiamate avevo temporizzato la cosa. Ora che me lo dici dopo aver integrato la tua libreria la "temporizzazione" è stata accantonata quindi pensandoci il dispositivo controlla costantemente Telegram e questo credo possa spiegare perchè il webserver sia lentissimo (insomma quello che dici tu).
In effetti per essere una centralina per l'irrigazione ho inserito un sacco di roba ma è stata anche una scusa per imparare un pochino come fare alcune cose.
Che l'uso delle stringhe fosse un problema l'ho scoperto in corso d'opera. Colgo l'occasione, se posso, per chiederti qualche consiglio a riguardo. Mi pare di capire che le variabili char siano da preferire alle string in termini di memoria. Ma se io non conosco la lunghezza di una variabile come di devo comportare. Faccio un esempio. Il token del bot telegram non si trova nel codice il quanto viene inserito da interfaccia webserver quindi salvato con il resto delle impostazioni in formato json. Dove vado a leggere il token non conosco la lunghezza dello stesso (magari per telegram è costante, non ho idea, ma diciamo di no) mentre se definisco una array di char mi sembra di capire che devo impostare la lunghezza durante la definizione. Come ci si comporta in questi casi? C'è modo di variare la lunghezza dell'array? Spero di essermi spiegato. Provengo a programmazione in Delphi in ambiente Windows quindi il mio modo di ragionare tende a quello, lì non ho questi tipi di limitazioni ovviamente mentre qui c'è da ottimizzare quanto più possibile.

Detto questo se hai tempo di "criticare" altro ben venga, fare sempre da autodidatta è dura, a volte il confronto aiuta a migliorarsi.

Nel frattempo vedo di implementare la temporizzazione di telegram e ti faccio sapere se risolvo.

Grazie ancora.

Allora dopo vari test, di cui uno durato diverse ore, penso di poter affermare che il problema è risolto. Sembra tutto funzionare correttamente a patto di usare la vecchia libreria esp8266 v2.4.2, usando l'ultima versione (v2.6.3) succedono infatti cose stranissime: la libreria telegram non riesce a instaurare la connessione e restituisce l'errore "Mancata connessione in trasmissione", ma non è l'unico problema che ho, spesso infatti il nodemcu si connette e si disconnette all'infinito dalla rete senza un apparente motivo (riportando l'errore "wifi disconnect ap_probe_send over, rest wifi status to disassoc") rendendo di fatto il dispositivo inutilizzabile. Non ho indagato sull'errore della libreria telegram con la versione 2.6.3 dato che non riesco a risolvere il problema delle disconnessioni wifi quindi penso continuerò a usare la versione 2.4.2. Penso comunque sia connesso al passaggio da axTLS con BearSSL e probabilmente và impostato il fingerprint di telegram o settata l'opzione insecure.
Se dovessi riuscire a modificare la libreria per farla funzionare con la 2.6.3 la posto qui.
Grazie per il momento.