Почему при отправке запроса модулем ESP8266 не происходит редирект на API телеграм?

Разрабатываю небольшой проект (https://flask-bot-xabor.amvera.io/), состоящий из: Сервер на Flask; Телеграм бот; Модуль Arduino (измерение напряжения в электросети и температуры и влажности).

Во view.py сервера есть точка для API:

#API для добавление в БД данных сенсоров на arduino
@app.route('/ard_update',methods = ['POST', 'GET'])
def ard_update():
    key = request.args.get('key')
    temp = float(request.args.get('field1'))
    humidity = int(request.args.get('field2'))
    voltage = int(request.args.get('field3'))

    if key == "********************":
        TELEGRAM_URL = "https://api.telegram.org/bot"
        part_url_for_1 = "/sendMessage?chat_id="
        chat_id = BaseConfig.CHAT_ID
        part_url_for_2 = "&text="
        text = "Внимание: ОТКЛЮЧЕНИЕ ЭЛЕКТРИЧЕСТВА. ДАТА: "
        BOT_TOKEN = BaseConfig.BOT_TOKEN
        now = datetime.datetime.now()
        now_str = str(now)

        request_telegram = TELEGRAM_URL + BOT_TOKEN + part_url_for_1 + chat_id + part_url_for_2 + text + now_str

        new_values = Sensors(temp=temp, humidity=humidity, voltage=voltage)
        try:
            db.session.add(new_values)
            db.session.commit()
        except:
            db.session.rollback()
            print("Ошибка добавления данных сенсоров в БД")
            return "Ошибка добавления данных сенсоров в БД"
        if voltage == 0:
            text = "Внимание: отключение электричества. Время: "
            #request_telegram = TELEGRAM_URL + BOT_TOKEN + part_url_for_1 + chat_id + part_url_for_2 + text + now_str
            voltage_off = VoltageOff(voltage=voltage)
            try:
                db.session.add(voltage_off)
                db.session.commit()
            except:
                db.session.rollback()
                print("Ошибка добавления данных сенсоров в БД")

            return redirect(request_telegram)
        else:
            return redirect("/")
        #return redirect(request_telegram)
    else:
        print("Неправильный API")
        # tasks = Todo.query.order_by(Todo.date_created).all()
        # sensor_values = Sensors.query.order_by(Sensors.date_send).all()

        #https://api.telegram.org/bot*********************************/sendMessage?chat_id=************&text=тдтолидлилил

        return redirect("/")

Смысл в том, что при пропадении напряжения ESP8266 отправлять GET-запрос; Сервер получает данную информацию, если напряжение == 0, то отправляется запрос на API телеграмм и сообщение улетает мне.

Проблема в том, что если отправить запрос через браузер перейдя по ссылке и заменив field3 на 0: https://flask-bot-xabor.amvera.io/ard_update?key=&field1=29.00&field2=60&field3=220 то уведомление в телеграм улетает

Если отправляет запрос модуль ESP8266, то значения добавляются в БД, рисуется график, но сообщение в телеграм не уходит.

Т.е. условие, что наапряжение == 0 выполняется и должен, по идее произойти редирект и отправиться сообщение, но этого почему-то не происходит.

На всякий случай часть скетча для ESP8266:

  WiFiClientSecure client;
  const int httpPort = 443; // 80 is for HTTP / 443 is for HTTPS!
  
  client.setInsecure(); // this is the magical line that makes everything work
  
  if (!client.connect(host1, httpPort)) { //works!
    Serial.println("connection failed");
    return;
  }
  else {
    Serial.print("Connected to: ");
    Serial.println(host1);
  }
//......................................................................
  String url = "/update?key=";         // Thingspeak
         url += APIkey;
         url += "&field1=";
         url += t;                     //DHT Температура
         url += "&field2=";
         url += h;                     //DHT Влажность 
         url += "&field3=";
         url += voltage;     
         url += "\r\n\r\n";

  String url1 = "/ard_update?key=";     // String для другого сервера
         url1 += APIkey;
         url1 += "&field1=";
         url1 += t;                     //DHT Температура
         url1 += "&field2=";
         url1 += h;                     //DHT Влажность 
         url1 += "&field3=";
         url1 += voltage;     
//         url1 += "\r\n\r\n";

  Serial.println("Sending data: ");
  //Serial.println(url);

                                       // Передача запроса серверу Thingspeak
  //client.print(String("GET ") + url + " HTTP/1.1\r\n" +
  //             "Host: " + host + "\r\n" +
  //             "Connection: close\r\n\r\n");  
                                       // Чтение данных от сервера и отправка в последовательный порт



  client.println(String("GET ") + url1 + " HTTP/1.1\r\n" +
               "Host: " + host1 + "\r\n" + 
               "Connection: close\r\n\r\n");
  //Serial.println(String("GET ") + url1 + " HTTP/1.1\r\n" +
  //             "Host: " + host1 + "\r\n" + 
  //             "Connection: close\r\n\r\n");
                   
  while (client.available()) 
  {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  Serial.println();

  delay(500);
  client.flush();     // ждем отправки всех данных

  Serial.println("closing connection");


  client.stop();

Подскажите, направление поиска проблемы? что-то не отрабатывает на стороне сервера или ESP8266, например раньше разрывает соединение и не успевает произойти редирект?


Ответы (2 шт):

Автор решения: WizAnd

ESP8266 соединяется с сервером в этой строке (client.connect(host1, httpPort))

А так как в коде view был редирект на другой host, то скорее всего ESP разрывал соединение:

return redirect(request_telegram)

Исправил view на следующие строки:

resp = requests.get(request_telegram)
            api_answer = resp.json()
            return render_template("ok.html", api_answer=api_answer)
→ Ссылка
Автор решения: eri

Esp8266 не делает редиректы сама. Вам нужно достать заголовки. Из них достать адрес.запустить новый клиент.

Почему бы не отправлять запросы телеграм с сервера?

→ Ссылка