Buongiorno,
eccomi a chiedere supporto per poter estrarre e "manipolare" dei dati provenienti da un array mqtt.
Sostanzialmente un volta inizializzato il tutto (con libreria Pubsubclient) mi ritrovo con questa parte di codice:
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
Un nodeMCU è collegato via wifi alla mia rete e ad un raspberry che "sputa" in continuazione dati con i parametri del mio inverter. Purtroppo l'invio continuo (ogni secondo) della mole di informazioni provenienti dal raspberry mi rallentano poi broker ed altro dispositivo dove "leggo ed analizzo" i dati.
L'idea è quella di dare in pasto tutte queste informazioni ad nodeMCU ed inviare al mio broker informazioni ogni 10 - 30 secondi solo se ci sono variazioni (ad esempio, se il SOC batteria è 35%, non mi serve che venga inviato ogni secondo tale valore). Lato raspberry non ho possibilità di modifica, è un prodotto commerciale chiuso che continua a sputare dati:
15:31:21.812 -> Message arrived [solar_assistant/battery_1/cell_voltage_-_lowest/state] 3.246
15:31:21.812 -> Message arrived [solar_assistant/battery_1/current/state] -17.8
15:31:21.812 -> Message arrived [solar_assistant/battery_1/cycles/state] 72
15:31:21.812 -> Message arrived [solar_assistant/battery_1/power/state] -869
15:31:21.812 -> Message arrived [solar_assistant/battery_1/state_of_charge/state] 49.7
15:31:21.812 -> Message arrived [solar_assistant/battery_1/temperature/state] 21.7
15:31:21.812 -> Message arrived [solar_assistant/battery_1/temperature_env/state] 23.3
15:31:21.859 -> Message arrived [solar_assistant/battery_1/temperature_mos/state] 22.0
15:31:21.859 -> Message arrived [solar_assistant/battery_1/voltage/state] 48.8
15:31:21.859 -> Message arrived [solar_assistant/total/battery_power/state] -869
15:31:21.859 -> Message arrived [solar_assistant/total/battery_state_of_charge/state] 50
(Questa è solo una piccola parte di informazioni che continuano a fluire).
Ciò che vorrei fare, è qualcosa del genere:
void callback(char* topic, byte* payload, unsigned int length) {
if(topic == "solar_assistant/total/battery_state_of_charge/state" {
Serial.print("SOC_batteria ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
SOC_Batteria = payload[i];
}
Serial.println();
}
Mi rendo conto di essere in alto mare... sostanzialmente vorrei prendere i vari valore che ricevo (tensione batteria, tensione cella, tensione da pannelli ecc.) ed associare i relativi valori a delle variabili (come nell'esempio sopra per il soc batteria).
Una volta verificato che il valore non è uguale a quello precedente e se sono passati almeno 10 o 2 o x secondi, devo inviare nuovamente il tutto al broker.
Come dicevo per ora la mia difficoltà è "spacchettare" e ricavare i dati dall'array char.
Quel che mi fa strano, è che la parte di codice originale (quella del "message arrived..." mi spezza correttamente tutte le informazioni e me le stampa su seriale. Ecco, io vorrei invece che quei dati venissero copiati in variabili con relativo payload.
Grazie