PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NodeMCU Webserver teilweise nicht erreichbar/hängt sich auf



B4DschK4Pp
13.06.2019, 10:56
Hallo zusammen,

Ich bin gerade dabei mein erstes Projekt mit dem NodeMCU zu verwirklichen. Dazu habe ich mir den DHT22 dazu geholt und gebe dessen Daten über einen Webserver auf dem NodeMCU im XML Format aus, die ich dann wiederum mit Icinga2 auslese und mir mit Grafana darstellen lasse. Ähnlich wie in diesem Tutorial: https://daniel-ziegler.com/monitoring/php/linux/esp8266/arduino/mikrocontroller/2017/08/18/update-raumklima-mit-naemon-und-grafana-esp8266/

Nun habe ich das Gefühl, dass sich der Webserver ab und zu aufhängt. Ich komme einfach nicht mehr drauf und auch Grafana zeigt mir, dass in dieser Zeit keine Daten empfangen werden konnten. Nach einer Weile fängt er sich dann wohl wieder.

Hat jemand gleiche Erfahrungen damit gemacht, oder liegt es vielleicht an meinem Code? Habe ich etwas vergessen oder falsch gemacht? Falsche Bibliotheken geladen?

34219



// DHT22 Struct
struct Humidity {
int humidity;
unsigned int humidityFrac;

int temperature;
unsigned int temperatureFrac;
};

#include <ESP8266WiFi.h>
#include "DHT.h"

const char* ssid = "<WlanSSID>";
const char* password = "<MeinWlanPasswort>";

#define DHTTYPE DHT22
const int DHTPin = D1;
DHT dht(DHTPin, DHTTYPE);

//Static IP
IPAddress ip(192, 168, 1, x);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
Serial.begin(115200);
delay(10);

dht.begin();

// prepare GPIO2
pinMode(2, OUTPUT);
digitalWrite(2, 0);

// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

//Disable WiFi AP
WiFi.mode(WIFI_STA);

//Set Static IP
WiFi.config(ip, gateway, subnet);

//Connect to WiFi
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");

// Start the server
server.begin();
Serial.println("Server started");

// Print the IP address
Serial.println(WiFi.localIP());

}

void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}

// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}

// Read the first line of the request
String req = client.readStringUntil('\r');
Serial.println(req);
client.flush();

Humidity humidity = getHumidityAndTemperature();

Serial.print("Humidity: ");
Serial.print(humidity.humidity);
Serial.print(".");
Serial.print(humidity.humidityFrac);
Serial.println("%");

Serial.print("Temperature: ");
Serial.print(humidity.temperature);
Serial.print(".");
Serial.print(humidity.temperatureFrac);
Serial.println("*C");

// Prepare the response
String response = "HTTP/1.1 200 OK\r\nContent-Type: application/xml\r\n\r\n<?xml version='1.0'?><document>";
response += "<humidity>";
response += humidity.humidity;
response += ".";
response += humidity.humidityFrac;
response += "</humidity>";

response += "<temperature>";
response += humidity.temperature;
response += ".";
response += humidity.temperatureFrac;
response += "</temperature>";

response += "<freeheap>";
response += ESP.getFreeHeap();
response += "</freeheap>";

response += "<cpufreqmhz>";
response += ESP.getCpuFreqMHz();
response += "</cpufreqmhz>";

response += "</document>\n";

// Send the response to the client
client.print(response);
delay(1);
Serial.println("Client disonnected");
Serial.println(server.status());

// The client will actually be disconnected
// when the function returns and 'client' object is destroyed
}

Humidity getHumidityAndTemperature() {
struct Humidity humidityStruct;
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();

humidityStruct.humidity = int(humidity);
humidityStruct.humidityFrac = (humidity - int(humidity)) * 100;

humidityStruct.temperature = int(temperature);
humidityStruct.temperatureFrac = (temperature - int(temperature)) * 100;

return humidityStruct;
}


Viele Grüße
B4DschK4Pp

Ceos
13.06.2019, 11:04
Erst einmal grundsätzlich gefragt ohne den Code gelesen zu haben:

Hast du die Firmware aktualisiert? Es gab in letzer Zeit viele viele updates die zu mehr Stabilität is gewissen Szenarien geführt haben (ich verfolge aktiv die Githubs der Projekte).

Du sagst dass du vermutest dass sich der Web"server" aufhängt, müsste das nicht von deinem Tool erfasst werden können?!

B4DschK4Pp
13.06.2019, 11:16
Tatsächlich habe ich die Firmware noch nicht aktualisiert. Habe den NodeMCU bekommen und wollte natürlich direkt loslegen. Dann muss ich mich damit mal beschäftigen und mir eine Anleitung raus suchen.

Ja, Icinga2 kann auch meinen Webserver checken. Das habe ich auch gemacht. Tatsächlich sehe ich hier aber keine Einbußen, aber die Sensordaten kommen über einen gewissen Zeitraum nicht an. Wenn ich auf die URL dann manuell im Browser gehe, bekomme ich einen TimeOut.

Ich beschäftige mich jetzt mal mit der Firmware Aktualisierung und schaue, ob es was bringt.
Vielen Dank erstmal.

HaWe
13.06.2019, 11:21
Aktualisieren vor allem auch die Arduino IDE (1.8.8 oder 1.8.9) und die ESP8266 Board cores (aktuell 2.5.2)
ich habe auch alte ESP8266 (ESP-12E), aber noch nie die Firmware aktualisieren müssen.


Nur wenn es damit nicht läuft, dann mal auf core 2.4.0 zurückgehen: da gibt es ein paar Inkompatibilitäten zu früheren Libs und Examples

Ceos
13.06.2019, 11:41
Wenn ich auf die URL dann manuell im Browser gehe, bekomme ich einen TimeOut.

Das klingt irgendwie danach als ob dein Tool die Webseite einfach aus dem Cache lädt! Ich habe leider keine Ahung von dem Tool, aber vielleicht kannst du A) den Tool überzeugen nicht gecachte Daten zu nutzen oder B) deinen Webserver so einrichten, dass er das Cachen der Seite verbietet (im HTML Header ist da eine Möglichkeit, aber ich muss erstmal nachsehen wie das nochmal ging XD)

B4DschK4Pp
13.06.2019, 11:47
Nein, das glaube ich nicht. Da wird nichts gecachet. Vor allen bekomme ich das Timeout ja auf einem anderen Rechner.
Wenn es cachen würde, müssten die Werte ja auch alle gleich sein, richtig? In dem angehängten Screenshot im ersten Bild sieht man ja auch, dass sich die Werte unterscheiden. Allerdings gibt es eben zu den markierten Zeiten keine Datenpunkte.

Ceos
13.06.2019, 11:58
Vor allen bekomme ich das Timeout ja auf einem anderen Rechner.

Genau DAS veranlasst mich zu denken dass das Tool den Timeout nicht mitbekommt sondern Daten aus einem Cache lädt!


Wenn es cachen würde, müssten die Werte ja auch alle gleich sein, richtig? In dem angehängten Screenshot im ersten Bild sieht man ja auch, dass sich die Werte unterscheiden. Allerdings gibt es eben zu den markierten Zeiten keine Datenpunkte.

Mh da hast du natürlich auch recht, hab die Grafik nciht so detailliert angesehen.


Ja, Icinga2 kann auch meinen Webserver checken. Das habe ich auch gemacht. Tatsächlich sehe ich hier aber keine Einbußen

wie genau sieht dieser Test denn aus!?


// The client will actually be disconnected
// when the function returns and 'client' object is destroyed


Woher stammt die Info? Ich lese hier mind. 2 Issues (okay sie sind älter) auf Github die sagen mit einem client.stop() am Ende der loop würde alles stabiler laufen. (Ist auch einfach gesprochen "anständiger" alle Objekte in definierte Zustände zu überführen bevor man sie fallen lässt!)

B4DschK4Pp
13.06.2019, 12:27
Zur Firmware:
Wie kann ich denn die aktuell installierte Firmware auslesen? Wollte mir den ESPlorer runterladen. Das File kann bei mir aber nicht komplett heruntergeladen werden, aus welchem Grund auch immer. Gibt es noch andere Möglichkeiten?
Als aktuelle Firmware nehme ich an, soll ich diese (https://github.com/nodemcu/nodemcu-firmware/releases) flashen mit dem esptool.py?


wie genau sieht dieser Test denn aus!?
Icinga2 ist ein OpenSource Monitoring Tool, das mit Nagios Plugins arbeiten kann. Den Webserver prüfe ich mit dem check_http (https://www.monitoring-plugins.org/doc/man/check_http.html) Plugin.


Woher stammt die Info? Ich lese hier mind. 2 Issues (okay sie sind älter) auf Github die sagen mit einem client.stop() am Ende der loop würde alles stabiler laufen. (Ist auch einfach gesprochen "anständiger" alle Objekte in definierte Zustände zu überführen bevor man sie fallen lässt!)
Das Script habe ich von der Seite, die im ersten Beitrag verlinkt ist. Einen client.stop() habe ich auch schon eingefügt im Abschnitt


// Send the response to the client
client.print(response);
delay(1);
Serial.println("Client disonnected");
Serial.println(server.status());


direkt nach delay(1);

EDIT:

Genau DAS veranlasst mich zu denken dass das Tool den Timeout nicht mitbekommt sondern Daten aus einem Cache lädt!

Was in den Screenshots nicht zu sehen ist, sind die Datenpunkte. Das Icinga Plugin wird alle 30 sec ausgeführt, ließt dann von der NodeMCU Seite die Sensordaten aus der XML aus und schreibt diesen Wert als Datenpunkt in Graphite. Grafana stellt die Daten dann als Graph dar. Schaue ich mir den Graphen dann genauer an, sehe ich, dass an den markierten Stellen keine Datenpunkte vorhanden sind. Grafana zieht dann einfach die Linie zwischen den letzten zwei Punkten, was in den längeren Strichen in den markierten Stellen resultiert.

Ceos
13.06.2019, 13:31
Nenn mich blind, aber das client.stop() kann ich keinem deiner beiden Beispiel Codes sehen (oder war das jetzt nur exemplarisch gepostet mit der Info es steht da ich habs nur nicht im Beitrag ergänzt?! es verwirrt mich gerade nur dass ich es nicht sehe)


Schaue ich mir den Graphen dann genauer an, sehe ich, dass an den markierten Stellen keine Datenpunkte vorhanden sind

war mir hinterher auch klar als ich genauer hingesehen hatte :P

Was die Firmware angeht, wenn du mit Serial verbunden bist und den Reset drückst, müsste eigentlich immer ein Printout der installierten Firmware kommen (natürlich nicht wenn du über virtual COM drin bist, weil dann auch der VCOm resettet wird XD)

ansonsten öhm lass mich kurz googlen ... "node.info()" müsste dir einen Versions-String geben

B4DschK4Pp
13.06.2019, 14:50
Nenn mich blind, aber das client.stop() kann ich keinem deiner beiden Beispiel Codes sehen
Ja, ich hatte es im Code ergänzt. :)

Ich blick noch nicht so ganz durch mit der Firmware, welche Module ich da hinzufügen muss bzw ob ich überhaupt welche benötige. NodeMCU Firmware Builder (https://nodemcu-build.com) Wie gesagt bin ich quasi blutiger Anfänger.
Sind das nur LUA Bibliotheken? Oder benötige ich zB auch das DHT Modul in der Firmware, wenn ich mit Arduino IDE mit C Code schreibe und die Daten vom DHT abfragen möchte?

HaWe
13.06.2019, 14:59
wenn du deinen ESP8266 (welchen Typ genau? nodeMCU ESP-12?) innerhalb der letzten 12 Monate gekauft hast, brauchst du IMO kein Firmwareupdate: verwende einfach die neuesten Cores und IDEs und die korrekten Libs.

Ceos
13.06.2019, 15:44
Ach jetzt ist mir schon wieder was im Kopf verrutscht, du programmierst ja mehr oder minder Bare Metal mit Arduino und hast die Firmware effektiv garnicht mehr drauf.

ich hab wie geasgt das Git dazu verfolgt und da gabs diverse patches (gerade in den vergangenen 3 Monaten @HaWe !!!) und da ging es um ähnliche Probleme mit der Stabilität wenn man Webservices anbietet und im Hinergrund auch noch zusätzliche Aufgaben abarbeitet hat der Webservice öfters mal sich einfach weggehangen und kam erst nach einer gewissen Auszeit wieder zurück.

Für dich is die NodeMCU Firmware ja völlig irrelevant XD

HaWe
13.06.2019, 17:02
(gerade in den vergangenen 3 Monaten @HaWe !!!)...Für dich is die NodeMCU Firmware ja völlig irrelevant XD
ja, ich meinte ja ebenfalls nur für Arduino Gebrauch, es handelt sich oben ja um einen Arduino Sketch.
Da zählen nur IDE Version, Lib Version und core Version.