Dispositivo IOT arduino mkr si blocca random

Salve,
vi chiedo un aiuto per il trubleshooting di un problema molto fastidioso che mi sta affliggendo.

Ho creato un dispositivo basato sul progetto OpenEnergymonitor che è molto interessante. Mi va ad inviare su HUB domotico tramite protocollo MQTT le letture di assorbimento e produzione di energia elettrica della casa e dei pannelli solari in tempo reale e mi permette di leggerle su cellulare.

Il tutto funziona a meraviglia per un tempo che varia randomicamente tra 1h e 12h circa dopodichè il dispositivo si disconnette dal router e non invia più dati.

Non ho molti elementi a disposizione per il trubleshooting di questo problema anche se sono abbastanza certo che tutta la parte HW sia a posto, in quanto basata su un progetto esistente e consolidato.
Credo che il problema sia il SW, ed in particolare non sono certo di aver usato le librerie corrette.

Le librerie che sono chiamate all’inizio del codice sono la pubsubclient.h che mi permette di inviare i dati tramite MQTT e la libreria ArduinoOTA.h che mi permette di poterlo programmare “over the air” perchè il dispositivo è cablato e mi è comodo poterlo programmare così in vista di correzioni successive al sistema per rispecchiare meglio i dati reali.

Ultimo dato che vi posso dire è che la scheda utilizzata è un Arduino MKR1000 in quanto mi era necessario avere la connessione internet per l’invio dei datì.

Allego il codice separatamente, causa i caratteri limitati in questo post. Trovate allegato sotto in .txt

Ho pensato anche a una possibile saturazione della memoria RAM del dispositivo visto che il tutto funziona per une buon lasso di tempo. E’ possibile ?

Mi potreste consigliare una strada o dei check per il trubleshooting del problema ??

Grazie mille a tutti!

Energy monitor.txt (9.55 KB)

Su Arduino Uno con una funzione è possibile sapere la SRAM libera. freeram o qualcosa del genere
https://playground.arduino.cc/Code/AvailableMemory/

Se c'e' una funzione analoga per quel dispositivo, allora conviene chiedere quanta ram libera c'e' e visualizzarla in qualche modo ogni tot tempo (esempio 10 minuti)

Per ora ho tamponato con un timer di Watchdog a 8S e sta funzionando.
Concettualmente non mi piace ma devo dire che è efficace.

Ho pensato di farmi prestare un pc portatile (perchè io non ne possiedo uno) e provare a vedere cosa esce dalla serial monitor.
Credo che possa essere uno dei pochi modi per avere ulteriori indizi per cercare di scovare la radice del problema

L'unica cosa che vedo nelo stralcio di programma che hai postato che possa causare blocchi rando per saturazione di memoria è la solita classe String che viene allocata dinamicamente ad ogni callback. Visto che sembra che tu la usi solo per controllare se è uguale a ON ti suggerirei di rimuovere la String (intesa come classe) e fare dirattemente una strncmp per verificare se payload è uguale a ON, abbastanza indolore e veloce da verificare se fosse quello a causare i blocchi "random"

fabpolli:
L'unica cosa che vedo nelo stralcio di programma che hai postato che possa causare blocchi rando per saturazione di memoria è la solita classe String che viene allocata dinamicamente ad ogni callback. Visto che sembra che tu la usi solo per controllare se è uguale a ON ti suggerirei di rimuovere la String (intesa come classe) e fare dirattemente una strncmp per verificare se payload è uguale a ON, abbastanza indolore e veloce da verificare se fosse quello a causare i blocchi "random"

Ciao,
Proverò a fare come hai detto.
Pensi che il problema possa sussistere anche se in realtà il callback non trova mai nessuna subscription? Perchè i messaggi sono solo dal sensore al brokerMQTT ma mai viceversa, e ovviamente non ho altre subscript su quel topic...

Se quella funzione di callback sei certo che non vega mai richiamata allora non dipende da quello, la rimozione della String ti occupa una manciata di minuti, falla comunque.
La strada del portatile per verificare il monitor seriale allora la vedo l'unica strada percorribile per tentare di capire dove si blocca.