Grüß euch!
Ich möchte gerne mit einen ESP8266-01S Sensor Daten aus einen FRAM Chip
auslesen und über Webserver zum Download zur Verfügung stellen. Ich habe
mich explizit für eine FRAM Variante entschieden und auf einen
Schreiben/Lesen über SPIFFS verzichtet aufgrund der Häufigkeit der
Schreibzyklen.
Daher war mein Zugang der, dass ich die Daten zur Laufzeit hin über aus
dem FRAM Auslese und über die ESPAsyncWebServer events.send an den
Webserver Client übetrage und anschließend die Daten mit JavaScript
auslese und zu einer .csv File zusammenbaue.
Das ganze funktioniert nur leider nicht mit den Übertragen der Daten
zwischen den Webserver und den ESP8266. Ca. 10 Messwerte werden
erfolgreich übertragen - anschließend kommt immer die Meldung "Event
Disconnected".
Die Funktion zum Übertragen der daten an den Client ist:
1 |
|
2 | void SensorJSONReadup(unsigned long intervall, bool _DownloadRequest){
|
3 | unsigned long currentMillis = millis();
|
4 | if((currentMillis - lastTime >= intervall) && !_DownloadRequest){
|
5 | events.send("ping",NULL,currentMillis);
|
6 | events.send(getSensorReadings().c_str(),"new_readings", currentMillis);
|
7 | lastTime = currentMillis;
|
8 | }
|
9 | //Read Sensor Data for Download by Webserver!
|
10 | if(_DownloadRequest){
|
11 | // Json Variable to hold sensor readings 4 Download
|
12 | JSONVar downloadData;
|
13 | //Serial.println(_DownloadRequest);
|
14 | //Serial.println("Enter READING Sensor Data from FRAM");
|
15 | if (!DataRecived) { //Confirm
|
16 | PowerValues get_data = ConvertSensorDataFromFRam(_i_down);
|
17 | PowerValues_print(get_data);
|
18 |
|
19 | downloadData["cur"] = String(get_data.current);
|
20 | downloadData["pow"] = String(get_data.power);
|
21 | downloadData["loadvol"] = String(get_data.loadvoltage);
|
22 | downloadData["time"] = String(get_data.timestamp);
|
23 |
|
24 | String jsonStringforDownload = JSON.stringify(downloadData);
|
25 | events.send(jsonStringforDownload.c_str(),"download_Data_csv", millis());
|
26 |
|
27 | DataRecived = 1;
|
28 |
|
29 | _i_down=_i_down+16;
|
30 | }
|
31 | if(_i_down >= j){
|
32 | Serial.println("Download Data DONE");
|
33 | DownloadTriggerd = 0;
|
34 | _i_down = 0;
|
35 | };
|
36 | };
|
37 | };
|
Anschließend warte ich bis über die Websocket bestätigt wird, dass Daten
empfangen wurden:
1 | //Confirm Data Recived
|
2 | server.on("/download_Data_done", HTTP_GET, [](AsyncWebServerRequest *request){
|
3 | if(DataRecived){
|
4 | DataRecived = 0;
|
5 | }
|
6 | request->send(200, "text/plain", "OK!");
|
7 | });
|
Im JavaScript code habe ich einen EventListener wie folgt angelegt der
mir dann die Daten empfängt und in der Konsole plottet bzw. bestätigt:
1 | source.addEventListener('download_Data_csv', function(e) {
|
2 | var xhr = new XMLHttpRequest();
|
3 | console.log("download_Data_csv, e.data");
|
4 | var myObj = JSON.parse(e.data);
|
5 | console.log(myObj);
|
6 | xhr.open("GET", "/download_Data_done", true);
|
7 | xhr.send();
|
8 | }, false);
|
Ich glaube ja das mein Hauptproblem noch darin liegt wie ich den
Datenempfang an den ESP8266 erfolgreich/nicht erfolgreich zurück
"checke" um den Event erfolgreich/nicht erfolgreich zu schließen bevor
der nächste Datensatz übermittelt wird?!?
Vielleicht hat ja jemand schon mal so was ähnliches realisiert...
mfg