Sporadic hang up of server on Nano 33 IoT

Dear Arduino Community,

I am working on a Info Station showing me some weather data, displaying outside temperature and so on. In the last weeks I tried to add the measurement of temperature and humidity in some cellar rooms. I am using for this three Nano 33 IoT, too, running a server which provides the measurement data, It works so far, but only for some hours. Then the Server Boards seem to hang up, because I can not read the data anymore, not with my main station arduino, nor with a pc.
So You can imagine, what my question is :slight_smile: Has someone of You an idea, where the problem could be?
Please find attached the code for the three server boards and the main board:

Server:

#include <WiFiNINA.h>
#include "WLAN_Daten.h"

#include "Adafruit_Si7021.h"

bool enableHeater = false;
uint8_t loopCnt = 0;

Adafruit_Si7021 sensor = Adafruit_Si7021();


///////////////////////////////
//globale Variablen Deklaration
///////////////////////////////
static char ssid_intra[] = SECRET_SSID_Intra;  // your network SSID (name)
static char pass_intra[] = SECRET_PASS_Intra;  // your network password (use for WPA, or use as key for WEP)
static char ssid_inter[] = SECRET_SSID_Inter;
static char pass_inter[] = SECRET_PASS_Inter;
static char ssid_ap[] = SECRET_SSID_AP;
static char pass_ap[] = SECRET_PASS_AP;


static IPAddress IP_Arduino (192, 168, 2, 44); //IP des Arduino
static IPAddress IP_Gateway (192, 168, 2, 1);  //IP des Gateway
static IPAddress dns (192, 168, 2, 1);
static IPAddress Subnet (255, 255, 255, 0);    //Subnet

int status = WL_IDLE_STATUS;//Status Variable für Netzwerkverbindung
//WiFiClient client;//WIFI Client initialisieren
WiFiServer server(80);



bool kein_Fehler = true;
bool debug = false;

void verbinde_Netzwerk(char WL_SSID[], char PASS[], IPAddress IP, IPAddress GATEWAY, IPAddress SUBNET) {
  while (status != WL_CONNECTED) {
    WiFi.config(IP_Arduino, dns, IP_Gateway, Subnet); //, GATEWAY, SUBNET);
    status = WiFi.begin(WL_SSID, PASS);
    delay(100);
  }
}

void print_debug(bool hatdebug, String Text) {
  if (hatdebug) {
    Serial.println(Text);
  }
}





void setup() {
  debug = false;
  if (debug) {
    Serial.begin(9600);
  }
  sensor.begin();
  delay(2000);
  verbinde_Netzwerk(ssid_ap, pass_ap, IP_Arduino, IP_Gateway, Subnet);
  print_debug(debug, "nach netzwerk verbinden inter");
  server.begin();
  if (debug) {
    printWifiStatus();
  }

}


void loop(void) {
  verbinde_Netzwerk(ssid_ap, pass_ap, IP_Arduino, IP_Gateway, Subnet);
  WiFiClient client = server.available();
  if (client) {
    print_debug(debug, "new client");
    // an HTTP request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the HTTP request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard HTTP response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.print("Luftfeuchtigkeit: ");
          client.print(sensor.readHumidity(), 0);
          client.print("%   ");
          client.print("Temperatur: ");
          client.print(sensor.readTemperature(), 0);
          client.print(" Grad");

          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    print_debug(debug, "client disconnected");
  }
}


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  print_debug(debug, "SSID: ");
  print_debug(debug, WiFi.SSID());

  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  print_debug(debug, "IP Address: ");
  print_debug(debug, IpAddress2String(ip));

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  print_debug(debug, "signal strength (RSSI):");
  print_debug(debug, String(rssi));
  print_debug(debug, " dBm");
}

String IpAddress2String(const IPAddress& ipAddress)
{
  return String(ipAddress[0]) + String(".") +\
  String(ipAddress[1]) + String(".") +\
  String(ipAddress[2]) + String(".") +\
  String(ipAddress[3])  ; 
}

and here the code of the main station:

#include <WiFiNINA.h>
#include "WLAN_Daten.h"
#include "Wetter_Funktionen.h"
#include <ArduinoJson.h>
#include <epd.h>
#include <TimeLib.h>
#include "ArduinoLowPower.h"


//Changelog
//2_0:Feuchtigkeitssensor hinzu
//1_9: Warnmeldungen von Heizung hinzugefügt
//1_8: DWD hinugefügt, Programmstruktur grundlegend überarbeitet
//1_7: Koordinaten korrigiert
//1_6: v_Wind für Tageswetter und aktuelles Wetter hinzu
//      Globake Variablen auf tatsächlich benötige Anzahl gekürzt
//1_5: aktuelle Windrichtugn von currtent date lesen statt hourly
//Info:https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json



///////////////////////////////
//globale Variablen Deklaration
///////////////////////////////
static char ssid_intra[] = SECRET_SSID_Intra;  // your network SSID (name)
static char pass_intra[] = SECRET_PASS_Intra;  // your network password (use for WPA, or use as key for WEP)
static char ssid_inter[] = SECRET_SSID_Inter;
static char pass_inter[] = SECRET_PASS_Inter;

static IPAddress IP_Heizung (192, 168, 2, 11); // IP der Heizung
static IPAddress IP_Arduino (192, 168, 2, 41); //IP des Arduino
static IPAddress IP_Sensor0 (192, 168, 2, 42); //IP des Tempsensor 0
static IPAddress IP_Sensor1 (192, 168, 2, 43); //IP des Tempsensor 1
static IPAddress IP_Sensor2 (192, 168, 2, 44); //IP des Tempsensor 2
static IPAddress IP_Gateway (192, 168, 2, 1);  //IP des Gateway
static IPAddress dns (192, 168, 2, 1);
static IPAddress Subnet (255, 255, 255, 0);    //Subnet

int status = WL_IDLE_STATUS;//Status Variable für Netzwerkverbindung
WiFiClient client;//WIFI Client initialisieren



bool kein_Fehler = true;
bool debug = false;
bool hat_ssh = true;
bool kein_ssh = false;
int json_groesse = 4500;
int timer_nacht = 25200000;//Wartezeit Nacht 7h = 420min=25200s=25200000ms
int timer_kurz = 3300000;//Wartezeit für Aktualisierung 55min= 3300s=3300000ms

long dir_wind_aktuell; //aktuelle Windrichtung in Grad
String v_wind_aktuell; //aktuelle Windgeschwindigkeit
String AussenTemp;//Variable für Außentemperatur
String Sensor0;//Variable für Kellersensoren
String Sensor1;//Variable für Kellersensoren
String Sensor2;//Variable für Kellersensoren
Tageswetter_type Tageswetter[3];
Stundenwetter_type Stundenwetter[8];


DynamicJsonDocument doc(JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + json_groesse);//JSON Variable für HTTP Request von OWM
DynamicJsonDocument doc_dwd(JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + json_groesse);//JSON Variable für HTTP Request von DWD
StaticJsonDocument<300> filter_owm;
StaticJsonDocument<600> filter_dwd;



char server_owm[] = "api.openweathermap.org";//OWM Serveradresse
String datarequest_owm = "/data/2.5/onecall?lat=48.9&lon=11.65&units=metric&lang=de&exclude=minutely&appid=1b225e68bc84051aeafe343cde48cfc3";
int  http_port_owm = 80;
String methode_owm = "GET";


char server_dwd[] = "api.brightsky.dev";//DWD Serveradresse
String datarequest_dwd = "/weather?tz=Europe/Berlin&lat=48.944&lon=11.569&date=";
int  http_port_dwd = 443;
String methode_dwd = "GET";


void setup() {
  debug = false;
  if (debug) {
    Serial.begin(9600);
  }
  delay(2000);
  /////////////////////////////
  //initialisieren des Displays
  /////////////////////////////
  Display_initialisieren();
  define_Filter_owm();
  define_Filter_dwd();
  if (debug) {
    Serial.println("Größe des OWM Filter ist:");
    Serial.println(filter_owm.memoryUsage());
    Serial.println("Größe des DWD Filter ist:");
    Serial.println(filter_dwd.memoryUsage());
  }

}


void loop(void) {

  epd_wakeup();
  delay(1000);
  epd_clear();

  /////////////////////////////////////////////////////////////////////////////////////
  //Temperatur_aktualisieren, alles was Intranet braucht, muss hier aktualisiert werden
  /////////////////////////////////////////////////////////////////////////////////////
  verbinde_Netzwerk(ssid_intra, pass_intra, IP_Arduino, IP_Gateway, Subnet);
  hole_Temperatur(IP_Heizung);
  String fehlertext = hole_Fehler(IP_Heizung);
  delay(100);
  //Kellersensoren abfragen

  Sensor1 = hole_Feuchtigkeit(IP_Sensor1);
  delay(200);
  Sensor2 = hole_Feuchtigkeit(IP_Sensor2);
  delay(200);
  Sensor0 = hole_Feuchtigkeit(IP_Sensor0);
  delay(200);



  trenne_Netzwerk();
  if (debug) {
    Serial.println("nach intra");
  }

  /////////////////////////////////////////////////////////////////////////////////
  //Wetter_aktualisieren, alles was Internet braucht, muss hier aktualisiert werden
  /////////////////////////////////////////////////////////////////////////////////
  verbinde_Netzwerk(ssid_inter, pass_inter, IP_Arduino, IP_Gateway, Subnet);
  if (debug) {
    Serial.println("nach netzwerk verbinden inter");
  }
  //Tageswetter von owm holen und befüllen
  doc = hole_Wetter(server_owm, datarequest_owm, http_port_owm, methode_owm, filter_owm, kein_ssh );
  if (debug) {
    Serial.println("nach owm holen");
    Serial.println("Größe des OWM jsons ist:");
    Serial.println(doc.memoryUsage());
  }
  befuelleTageswetter(doc);


  //Zeitstempel für den aktuellen Tag zur Datumsberechnung
  unsigned long t = doc["daily"][0]["dt"];
  String Datum_heute = String(year(t)) + "-" + String(month(t)) + "-" + String(day(t));
  t = t + 86400;
  String Datum_morgen = String(year(t)) + "-" + String(month(t)) + "-" + String(day(t));

  //Zeitstempel für die aktuelle Stunde zur Stundenberechnung
  t = doc["hourly"][0]["dt"].as<unsigned long>() + doc["timezone_offset"].as<unsigned long>();

  //Unterscheidung, ob nach 16Uhr, weil dann auch Daten des folgenden Tages nötig werden
  if (hour(t) > 16) {
    //t=17
    int EndStundeHeute = 24 - hour(t);
    int StartStunde_morgen = 24 - hour(t);
    doc_dwd = hole_Wetter(server_dwd, datarequest_dwd  + Datum_heute, http_port_dwd, methode_dwd, filter_dwd, hat_ssh );
    befuelleStundenwetter_dwd(doc_dwd, t, 0, EndStundeHeute);
    doc_dwd = hole_Wetter(server_dwd, datarequest_dwd  + Datum_morgen, http_port_dwd, methode_dwd, filter_dwd, hat_ssh );
    befuelleStundenwetter_dwd(doc_dwd, t, StartStunde_morgen, 8);
  }
  else {
    //wetter nur von heute
    int AnzahlStunden = 8;
    int StartStunde = 0;
    doc_dwd = hole_Wetter(server_dwd, datarequest_dwd  + Datum_heute, http_port_dwd, methode_dwd, filter_dwd, hat_ssh );
    befuelleStundenwetter_dwd(doc_dwd, t, StartStunde, AnzahlStunden);
    if (debug) {
      Serial.println("nach befüllen stundenwetter dwd");
    }
  }

  ////////////////////////////////
  //Trennen der Internetverbindung
  ////////////////////////////////
  trenne_Netzwerk();

  if (kein_Fehler) {
    zeichne_Stundenwetter();
    zeichne_Tageswetter();
    zeichne_Aussentemp();
    zeichne_Gitter();

    //Unterscheidung, ob Fehler von Heizung vorliegt, oder nicht
    if (strcmp(fehlertext.c_str(), "--") == 0) {
      //kein Fehler von Heizung, nichts zu tun
      if (debug) {
        Serial.println("kein Heizungsfehler");
      }
    }
    else {
      //Fehler da, Zeile mit Fehler schreiben
      if (debug) {
        Serial.println("Fehlertext:");
        Serial.println(fehlertext);
      }
      epd_disp_string(fehlertext.c_str(), 0, 100);
    }
    epd_update();
    WiFi.end();
    delay(1000);
    epd_enter_stopmode();
    delay(100);
    if (strcmp(Stundenwetter[0].Stunde.c_str(), "21:00 Uhr") == 0) {
      if (debug) {
        Serial.println("timer:");
        Serial.println(timer_nacht);
        Serial.println(timer_kurz);
      }
      LowPower.sleep(timer_nacht);
    }
    //delay(timer_kurz);
    LowPower.sleep(timer_kurz);
  }
  if (!kein_Fehler) {
    epd_disp_string("Versuche es in 30s nochmal", 0, 100);
    epd_update();
    delay(30000);
    kein_Fehler = true;
  }
}

void Display_initialisieren() {
  epd_init();
  epd_wakeup();
  epd_set_memory(MEM_NAND);
  epd_set_en_font(ASCII32);
  byte message[] = {0xA5, 0x00, 0x0A, 0x07, 0x01, 0xCC, 0x33, 0xC3, 0x3C, 0xA9};
  Serial1.write(message, sizeof(message));
}






void befuelleTageswetter(DynamicJsonDocument doc_temp) {

  for (int n = 0; n < 3; n++) {
    Tageswetter[n].Tag = Wochentag(doc_temp["daily"][n + 1 ]["dt"]);
    Tageswetter[n].Temp = String(int(roundf(doc_temp["daily"][n + 1]["temp"]["min"].as<float>()))) + "/" + String(int(roundf(doc_temp["daily"][n + 1 ]["temp"]["max"].as<float>()))) + " Grad" ;
    Tageswetter[n].Icon = id2icon(doc_temp["daily"][n + 1]["weather"][0]["icon"].as<String>(), doc_temp["daily"][n + 1]["weather"][0]["id"]); //+".BMP";
    Tageswetter[n].Windspeed = String(int(roundf(3.6 * doc_temp["daily"][n + 1]["wind_speed"].as<float>()))) + " km/h";

  }
  dir_wind_aktuell = doc_temp["current"]["wind_deg"];
  v_wind_aktuell = String(int(roundf(3.6 * doc_temp["current"]["wind_speed"].as<float>()))) + " km/h";
}

void befuelleStundenwetter(DynamicJsonDocument doc_temp) {
  //Zeit_offset = doc_temp["daily"]["timezone_offset"];
  for (int n = 0; n < 8; n++) {
    Stundenwetter[n].Stunde =  Stunde(doc_temp["hourly"][n]["dt"]);
    Stundenwetter[n].Temp = String(int(roundf(doc_temp["hourly"][n]["temp"].as<float>())))  + " Grad";
    Stundenwetter[n].Windspeed = String(int(roundf(3.6 * doc_temp["hourly"][n]["wind_speed"].as<float>()))) + "/" + String(int(roundf(3.6 * doc_temp["hourly"][n]["wind_gust"].as<float>())))   + " km/h";
    Stundenwetter[n].Icon = id2icon(doc_temp["hourly"][n]["weather"][0]["icon"].as<String>(), doc_temp["hourly"][n]["weather"][0]["id"]);
  }
}

void befuelleStundenwetter_dwd(DynamicJsonDocument doc_temp, unsigned long timestamp, int Start_Stunde, int Anzahl_Stunden) {

  for (int n = Start_Stunde; n < Anzahl_Stunden; n++) {
    Stundenwetter[n].Stunde =  doc_temp["weather"][(n + hour(timestamp)) % 24 ]["timestamp"].as<String>().substring(11, 16) + " Uhr";
    Stundenwetter[n].Temp = String(int(roundf(doc_temp["weather"][(n + hour(timestamp)) % 24 ]["temperature"].as<float>())))  + " Grad";
    Stundenwetter[n].Windspeed = String(int(roundf(doc_temp["weather"][(n + hour(timestamp)) % 24]["wind_speed"].as<float>()))) + "/" + String(int(roundf(doc_temp["weather"][(n + hour(timestamp)) % 24]["wind_gust_speed"].as<float>())))   + " km/h";
    Stundenwetter[n].Icon = id2icon_dwd(doc_temp["weather"][(n + hour(timestamp)) % 24]["icon"].as<String>());
    Stundenwetter[n].Regenmenge = doc_temp["weather"][(n + hour(timestamp)) % 24]["precipitation"].as<float>();
  }
}

String hole_Fehler(IPAddress IP) {
  String Ausgabe = "--";
  if (client.connect(IP, 8080)) {
    client.println("GET /user/errors");
    client.println("Host: " + String(IP));
    client.println("Connection: close");
    client.println();
    Ausgabe = client.readString(); //lies response in String
    if  (Ausgabe.indexOf("error msg=") == -1) { //kein error msg gefunden
      Ausgabe = "--";
      return Ausgabe;
    }
    else {
      int pos_value = Ausgabe.indexOf("error msg="); //berechne Position von "Value="
      int pos_Anf_Zeichen = Ausgabe.substring(pos_value + 11).indexOf("\""); //berechne Position von ersten " im Teilstring
      return Ausgabe.substring(pos_value + 11, pos_value + 11 + pos_Anf_Zeichen);
    }
  }
  else {
    return Ausgabe;
  }
}

String hole_Feuchtigkeit(IPAddress IP) {
  String Ausgabe = "--";
  if (client.connect(IP, 80)) {
    client.println("GET ");
    client.println("Host: " + String(IP));
    client.println("Connection: close");
    client.println();
    delay(100);
    Ausgabe = client.readString(); //lies response in String
    delay(100);
    //Luftfeuchtigkeit: 58% Temperatur: 23 Grad

    if (debug) {
      Serial.println("ganze Antowort Arduino");
      Serial.println(Ausgabe);
    }
    int ende_luft = Ausgabe.indexOf(" Grad") + 1;
    int start_luft = ende_luft - 3;
    int ende_temp = Ausgabe.indexOf("%") + 1;
    int start_temp = ende_temp - 3;
    Ausgabe = Ausgabe.substring(start_luft, ende_luft) + "C  " + Ausgabe.substring(start_temp, ende_temp);
    return Ausgabe;
  }
  else {
    return Ausgabe;
  }
}

void hole_Temperatur(IPAddress IP) {

  String Ausgabe;
  if (client.connect(IP, 8080)) {
    client.println("GET /user/var/40/10241/0/0/12197");
    client.println("Host: " + String(IP));
    client.println("Connection: close");
    client.println();
    Ausgabe = client.readString(); //lies response in String
    int pos_value = Ausgabe.indexOf("Value="); //berechne Position von "Value="
    int pos_Anf_Zeichen = Ausgabe.substring(pos_value + 7).indexOf("\""); //berechne Position von ersten " im Teilstring
    AussenTemp = Ausgabe.substring(pos_value + 7, pos_value + 7 + pos_Anf_Zeichen) + " Grad";
  }
  else {
    AussenTemp = "--";
  }
}

void verbinde_Netzwerk(char WL_SSID[], char PASS[], IPAddress IP, IPAddress GATEWAY, IPAddress SUBNET) {
  while (status != WL_CONNECTED) {
    WiFi.config(IP_Arduino, dns, IP_Gateway, Subnet); //, GATEWAY, SUBNET);
    status = WiFi.begin(WL_SSID, PASS);
    delay(100);
  }
}

void trenne_Netzwerk() {
  client.stop();
  WiFi.disconnect();
  status = WL_IDLE_STATUS;
  delay(500);
}

void zeichne_Stundenwetter() {
  //Felder 1-8 aktualisieren
  for (int m = 0; m < 8; m++) {
    int z = 0;
    if (m < 4) {
      epd_disp_string(Stundenwetter[m].Stunde.c_str(), 40 + m * 200, 135);
      epd_disp_string(Stundenwetter[m].Temp.c_str(), 40 + m * 200, 167);
      epd_disp_bitmap(Stundenwetter[m].Icon.c_str(), m * 200, 0);
      epd_disp_string(Stundenwetter[m].Windspeed.c_str(), 0 + m * 200, 0);
      if (Stundenwetter[m].Regenmenge > 0) {
        epd_disp_string((String(Stundenwetter[m].Regenmenge).substring(0, String(Stundenwetter[m].Regenmenge).lastIndexOf('.') + 2) + " mm").c_str(), 0 + m * 200, 103);
      }
    }
    if (m > 3) {
      z = m - 4;
      epd_disp_string(Stundenwetter[m].Stunde.c_str(), 40 + z * 200, 335);
      epd_disp_string(Stundenwetter[m].Temp.c_str(), 40 + z * 200, 367);
      epd_disp_bitmap(Stundenwetter[m].Icon.c_str(), z * 200, 200);
      epd_disp_string(Stundenwetter[m].Windspeed.c_str(), 0 + z * 200, 200);
      if (Stundenwetter[m].Regenmenge > 0) {
        epd_disp_string((String(Stundenwetter[m].Regenmenge).substring(0, String(Stundenwetter[m].Regenmenge).lastIndexOf('.') + 2) + " mm").c_str(), 0 + z * 200, 303);
      }
    }
  }
}

void zeichne_Tageswetter() {
  //Felder 9-11 aktualisieren
  for (int j = 0; j < 3; j++) {
    epd_disp_string(Tageswetter[j].Tag.c_str(), 40 + (j ) * 200, 535);
    epd_disp_string(Tageswetter[j].Temp.c_str(), 40 + (j ) * 200, 567);
    epd_disp_bitmap(Tageswetter[j].Icon.c_str(), (j ) * 200, 400);
    epd_disp_string(Tageswetter[j].Windspeed.c_str(), 0 + j * 200, 400);
  }
}

void zeichne_Aussentemp() {
  int Abstand_Wand = 5;
  //Windgeschwindigkeit drucken
  epd_disp_string(v_wind_aktuell.c_str(),  3 * 200 + Abstand_Wand, 400);
  //Windrichtung drucken
  epd_disp_string(grad2icon(dir_wind_aktuell).c_str(),  3 * 200 + Abstand_Wand, 432);
  //Außentemp drucken
  epd_disp_string(AussenTemp.c_str(), 3 * 200 + Abstand_Wand, 464);
  if (debug) {
    Serial.println("Tempsensoren:");
    Serial.println(Sensor0);
    Serial.println(Sensor1);
    Serial.println(Sensor2);
  }
  //Sensor1
  epd_disp_string(("V:" + Sensor0).c_str(), 3 * 200 + Abstand_Wand, 502);
  //Sensor2
  epd_disp_string(("L:" + Sensor1).c_str(), 3 * 200 + Abstand_Wand, 535);
  //Sensor3
  epd_disp_string(("W:" + Sensor2).c_str(), 3 * 200 + Abstand_Wand, 567);
}

void define_Filter_owm() {
  filter_owm["timezone_offset"] = true;
  filter_owm["current"]["wind_deg"] = true;
  filter_owm["current"]["wind_speed"] = true;
  filter_owm["hourly"][0]["dt"] = true;
  filter_owm["daily"][0]["dt"] = true;
  filter_owm["daily"][0]["wind_speed"] = true;
  filter_owm["daily"][0]["temp"]["min"] = true;
  filter_owm["daily"][0]["temp"]["max"] = true;
  filter_owm["daily"][0]["weather"][0]["icon"] = true;
  filter_owm["daily"][0]["weather"][0]["id"] = true;
  filter_owm["daily"]["timezone_offset"] = true;
}

void define_Filter_dwd() {
  int i = 0;
  for (i; i < 24; i++) {
    filter_dwd["weather"][i]["temperature"] = true;
    filter_dwd["weather"][i]["wind_speed"] = true;
    //filter_dwd["weather"][i]["cloud_cover"] = true;precipitation
    filter_dwd["weather"][i]["precipitation"] = true;
    filter_dwd["weather"][i]["wind_gust_speed"] = true;
    filter_dwd["weather"][i]["wind_gust_speed"] = true;
    filter_dwd["weather"][i]["icon"] = true;
    filter_dwd["weather"][i]["timestamp"] = true;
  }
}

DynamicJsonDocument hole_Wetter(char server[], String request, int port, String methode, StaticJsonDocument<400> filter, bool modus_ssh ) {

  bool client_connected;
  if (modus_ssh) {
    client_connected = client.connectSSL(server, port);
  }
  else {
    client_connected = client.connect(server, port);
  }
  DynamicJsonDocument doc_temp(JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + json_groesse);
  if (client_connected) {
    // Make a HTTP request:
    /////////ONE CALL/////////////
    client.println(methode + " " + request + " HTTP/1.0");//oder 1.0
    if (debug) {
      Serial.println("anfrage an server");
      Serial.println(server + methode + " " + request + " HTTP/1.0");
    }
    client.println("Host: " + String(server));
    client.println("Connection: close");
    client.println(); // end HTTP request header
  } else {
    epd_clear();
    epd_disp_string("FEHLER", 0, 10);
    epd_disp_string("Konnte Server nicht verbinden", 0, 50);
    kein_Fehler = false;
  }


  char endOfHeaders[] = "\r\n\r\n";
  if (!client.find(endOfHeaders)) {
    epd_clear();
    epd_disp_string("FEHLER", 0, 10);
    epd_disp_string("Antwort vom Server fehlerhaft", 0, 50);
    epd_disp_string(request.c_str(), 0, 200);
    kein_Fehler = false;
    return doc_temp;
  }

  // Parse JSON object
  DeserializationError error = deserializeJson( doc_temp, client, DeserializationOption::Filter(filter));

  if (error) {
    epd_clear();
    epd_disp_string("FEHLER", 0, 10);
    epd_disp_string("deserializeJson() failed: ", 0, 50);
    epd_disp_string(error.c_str(), 0, 90);
    kein_Fehler = false;
    return doc_temp;
  }
  delay(1000);
  if (debug) {
    String line = "";
    while (client.connected()) {
      line = client.readStringUntil('\n');
      Serial.println(line);
    }
  }
  return doc_temp;
}

I have put some functions in an own lib "Wetterfunktionen.h" please finde the code here:

#include <epd.h>

typedef struct
{
  String Tag;
  String Temp;
  String Icon;
  String Windspeed;
}  Tageswetter_type;

typedef struct
{
  String Stunde;
  String Temp;
  String Icon;
  String Windspeed;
  float Regenmenge;
}  Stundenwetter_type;

String Testfunktion() {
  return "Teststring";
}



String grad2icon(long grad) {
  if (grad >= 0 && grad < 23) {
    return "N";
  }
  if (grad > 22 && grad < 68) {
    return "NO";
  }
  if (grad > 67 && grad < 113) {
    return "O";
  }
  if (grad > 112 && grad < 158) {
    return "SO";
  }
  if (grad > 157 && grad < 203) {
    return "S";
  }
  if (grad > 202 && grad < 248) {
    return "SW";
  }
  if (grad > 247 && grad < 293) {
    return "W";
  }
  if (grad > 292 && grad < 338) {
    return "NW";
  }
  if (grad > 337 && grad < 361) {
    return "N";
  }
  return "13.BMP";
}



String id2icon(String icon, int ID) {
  String TagesZeit = "";
  TagesZeit = icon.charAt(2);
  switch (ID) {
    case 200: return "1.BMP"; break;
    case 201: return "1.BMP"; break;
    case 202: return "2.BMP"; break;
    case 210: return "1.BMP"; break;
    case 211: return "1.BMP"; break;
    case 212: return "2.BMP"; break;
    case 221: return "1.BMP"; break;
    case 230: return "1.BMP"; break;
    case 231: return "1.BMP"; break;
    case 232: return "1.BMP"; break;
    case 300: return "3.BMP"; break;
    case 301: return "3.BMP"; break;
    case 302: return "3.BMP"; break;
    case 310: return "3.BMP"; break;
    case 311: return "3.BMP"; break;
    case 312: return "3.BMP"; break;
    case 313: return "4" + TagesZeit + ".BMP"; break;
    case 314: return "4" + TagesZeit + ".BMP"; break;
    case 321: return "4" + TagesZeit + ".BMP"; break;
    case 500: return "3.BMP"; break;
    case 501: return "6.BMP"; break;
    case 502: return "6.BMP"; break;
    case 503: return "7.BMP"; break;
    case 504: return "7.BMP"; break;
    case 511: return "8.BMP"; break;
    case 520: return "4" + TagesZeit + ".BMP"; break;
    case 521: return "4" + TagesZeit + ".BMP"; break;
    case 522: return "4" + TagesZeit + ".BMP"; break;
    case 531: return "4" + TagesZeit + ".BMP"; break;
    case 600: return "9.BMP"; break;
    case 601: return "9.BMP"; break;
    case 602: return "10.BMP"; break;
    case 611: return "11.BMP"; break;
    case 612: return "11.BMP"; break;
    case 613: return "11.BMP"; break;
    case 615: return "11.BMP"; break;
    case 616: return "11.BMP"; break;
    case 620: return "9.BMP"; break;
    case 621: return "9.BMP"; break;
    case 622: return "10.BMP"; break;
    case 701: return "12.BMP"; break;
    case 721: return "12.BMP"; break;
    case 741: return "12.BMP"; break;
    case 771: return "14.BMP"; break;
    case 800: return "15" + TagesZeit + ".BMP"; break;
    case 801: return "15" + TagesZeit + ".BMP"; break;
    case 802: return "16" + TagesZeit + ".BMP"; break;
    case 803: return "16" + TagesZeit + ".BMP"; break;
    case 804: return "18.BMP"; break;
    default: return "13.BMP"; break;
  }
}






String id2icon_dwd(String icon) {
  //bool kein_icon;
  if (icon.equals("clear-day")) {
    return "15D.BMP";
  }
  if (icon.equals("clear-night")) {
    return "15N.BMP";
  }
  if (icon.equals("partly-cloudy-day")) {
    return "16D.BMP";
  }
  if (icon.equals("partly-cloudy-night")) {
    return "16N.BMP";
  }
  if (icon.equals("cloudy")) {
    return "17.BMP";
  }
  if (icon.equals("fog")) {
    return "12.BMP";
  }
  if (icon.equals("wind")) {
    return "14.BMP";
  }
  if (icon.equals("sleet")) {
    return "3.BMP";
  }
  if (icon.equals("rain")) {
    return "6.BMP";
  }
  if (icon.equals("snow")) {
    return "9.BMP";
  }
  if (icon.equals("hail")) {
    return "10.BMP";
  }
  if (icon.equals("thunderstorm")) {
    return "1.BMP";
  }

  return "13.BMP";

}



String Wochentag(unsigned long t) {
  switch ((((t + 7200) / 86400) + 4) % 7) {
    case 0: return "Sonntag"; break;
    case 1: return "Montag"; break;
    case 2: return "Dienstag"; break;
    case 3: return "Mittwoch"; break;
    case 4: return "Donnerstag"; break;
    case 5: return "Freitag"; break;
    case 6: return "Samstag"; break;
    default: return "Wochentag"; break;
  }
}

String Stunde(unsigned long t) {
  return  String((((t +   7200) / 3600) ) % 24) += ":00 Uhr";
}


void zeichne_Gitter() {
  //wagerecht
  epd_draw_line(0, 0, 799, 0);
  epd_draw_line(0, 135, 799, 135);
  epd_draw_line(0, 167, 799, 167);
  epd_draw_line(0, 199, 799, 199);
  epd_draw_line(0, 335, 799, 335);
  epd_draw_line(0, 367, 799, 367);
  epd_draw_line(0, 399, 799, 399);
  epd_draw_line(0, 535, 799, 535);
  epd_draw_line(0, 567, 799, 567);
  epd_draw_line(0, 599, 799, 599);
  //Senkrecht
  epd_draw_line(0, 0, 0, 599);
  epd_draw_line(199, 0, 199, 599);
  epd_draw_line(399, 0, 399, 599);
  epd_draw_line(599, 0, 599, 599);
  epd_draw_line(799, 0, 799, 599);
  //kleine Teilstriche wagerecht
    epd_draw_line(599, 431, 799, 431 );
  epd_draw_line(599, 463 , 799, 463);
  epd_draw_line(599,  495 , 799,   495);
  epd_draw_line(599,  499 , 799,   499);
   epd_draw_line(599,  503 , 799,   503);
  

}

I think most of this code does not matter, I thing the issue should have to do with the server code or the reading function in the main station code called "hole_Feuchtigkeit":

String hole_Feuchtigkeit(IPAddress IP) {
  String Ausgabe = "--";
  if (client.connect(IP, 80)) {
    client.println("GET ");
    client.println("Host: " + String(IP));
    client.println("Connection: close");
    client.println();
    delay(100);
    Ausgabe = client.readString(); //lies response in String
    delay(100);
    //Luftfeuchtigkeit: 58% Temperatur: 23 Grad

    if (debug) {
      Serial.println("ganze Antowort Arduino");
      Serial.println(Ausgabe);
    }
    int ende_luft = Ausgabe.indexOf(" Grad") + 1;
    int start_luft = ende_luft - 3;
    int ende_temp = Ausgabe.indexOf("%") + 1;
    int start_temp = ende_temp - 3;
    Ausgabe = Ausgabe.substring(start_luft, ende_luft) + "C  " + Ausgabe.substring(start_temp, ende_temp);
    return Ausgabe;
  }
  else {
    return Ausgabe;
  }
}

Interesting is, that I get "C " as output, so it seems, that I can connect to the server, because in the other case I would get "--" as output, but I do not get the values anymore...

Thanks in advance for any tip,

Lukas

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.