Почему при отправке запроса модулем 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 шт):
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)
Esp8266 не делает редиректы сама. Вам нужно достать заголовки. Из них достать адрес.запустить новый клиент.
Почему бы не отправлять запросы телеграм с сервера?