- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: NodeMCU Webserver teilweise nicht erreichbar/hängt sich auf

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.06.2019
    Beiträge
    5

    NodeMCU Webserver teilweise nicht erreichbar/hängt sich auf

    Anzeige

    Powerstation Test
    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/monitorin...afana-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?

    Klicke auf die Grafik für eine größere Ansicht

Name:	Bildschirmfoto 2019-06-13 um 10.45.05.png
Hits:	8
Größe:	98,6 KB
ID:	34219

    Code:
    // 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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    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?!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    13.06.2019
    Beiträge
    5
    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.

  4. #4
    HaWe
    Gast
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    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)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    13.06.2019
    Beiträge
    5
    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.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    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!?

    Code:
      // 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!)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    13.06.2019
    Beiträge
    5
    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 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 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

    Code:
       // 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.
    Geändert von B4DschK4Pp (13.06.2019 um 12:35 Uhr)

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    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
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    13.06.2019
    Beiträge
    5
    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 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?

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. NodeMCUv3 Webserver nicht von überall erreichbar
    Von Karl123 im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 3
    Letzter Beitrag: 30.01.2017, 08:14
  2. NodeMCU v.1 Webserver wird nicht im WLANi-Netz gefunden/angezeigt
    Von oderlachs im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 4
    Letzter Beitrag: 18.10.2016, 13:38
  3. Webserver nicht aus dem Netz erreichbar =(
    Von Felix H. im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 13
    Letzter Beitrag: 04.08.2010, 21:01
  4. Lade Programm geht nicht (hängt sich auf)
    Von REX im Forum Robby CCRP5
    Antworten: 1
    Letzter Beitrag: 11.09.2004, 05:19

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen