Patrick-E-Rankin / ESP32StockTicker

Basic stock ticker using ESP32 and MAX7219 LED Matrix. Produces a webpage so user can input a ticker.
17 stars 3 forks source link

Pretty good with ESP32, but I dont get with ESP8266 #2

Open lorenzobarrio opened 3 years ago

lorenzobarrio commented 3 years ago

The code works perfectly in ESP32. I did it changes and creates another with Telegram instead LED matrix, and it works really good. As you say it is simple but it works. Normally I use Telegram with ESP8266 with WiFi.Insecure, but in this case, yahoo needs https that I think is my problem!!. If I use it doesnt work the GET metoth in yahoo, and if I use WiFisecure with a hipotetic cert, doesnt work the connection with Telegram.....Someone has something in his mind to solve this situation!!!! Good day!!

Patrick-E-Rankin commented 3 years ago

Hi, in order to get to work on ESP8266 I use the RSA fingerprint method. Something like this: http.begin(serverName+ticker1+token,"74:79:EA:92:97:56:A5:C7:94:9B:2C:DD:97:B4:64:15:4F:23:F7:FF"); //HTTPS fingerprint

I built a whole version of this but for an OLED and an ESP8266 instead, are you interested in seeing that code?

eqamppp commented 3 years ago

I'm not the initial comment, but I would love to see the ESP8266 version you made.

lorenzobarrio commented 3 years ago

Hi @Patrick-E-Rankin, Thank you for your answer. Sorry for the delay in my replay. As other many methods, I used this fingerprint method and ESP8266 connect with Telegram. I tried with your fingerprint or the other fingerprint that it worked to me was {0xF2,0xAD,0x29,0x9C,0x34,0x48,0xDD,0x8D,0xF4,0xCF,0x52,0x32,0xF6,0x57,0x33,0x68,0x2E,0x81,0xC1,0x90}. My problem is that if connect with Telegram with these fingerprints, but then it cannot connect with yahoo!!. I tried then to write the fingerprint of yahoo but then it cannot connect with telegram ( I can see the number by Serialmonitor). I am going to write here the code for @eqamppp but it doesn't work. Oh, and answering your question: "Yes, I would be very happy if you show me your ESP8266 code that works ;-) Normally I use always ESP32 but I have some ESP8266 that I don't use and it would be good for this project that I don't need analog inputs. Thank you very much. My code based on yours...

//This code came from https://github.com/Patrick-E-Rankin/ESP32StockTicker

//Librerias:

if defined(ESP8266)

define HARDWARE

include

include "ESP8266HTTPClient.h"

include

else

define HARDWARE

include

include

endif

include

include //Solo necesario para PlatformIO

include

include

include

include

AsyncWebServer server(80);

//Token del bot de Telegram que muestra el Botfather.

define BOT_TOKEN ":" //bot PruebasAnalisis_bot

define SENDER_ID_COUNT 2 //Cantidad de usuarios que pueden interactuar con el bot.

define intervalo1Seg 1000 //Intervalo entre comprobaciones de nuevos mensajes.

//Id's de los usuarios que pueden interactuar con el bot. //Es posible verificar su id por el monitor serie al enviar un mensaje al bot. const String validSenderIds[SENDER_ID_COUNT] = {"", ""}; //el primero es el correcto mio, el segundo es Fabio. No poner mas que tarda mucho en evaluar si es correcto. //const String validSenderIds[SENDER_ID_COUNT] = {"***"}; //este es el de David. //Creaci贸n de Objetos //Cliente para conexiones seguras. X509List cert(TELEGRAM_CERTIFICATE_ROOT); // Solo para ESP8266

WiFiClientSecure clienteWiFi; // Crea el objeto client como cliente WiFi seguro.//

//Objeto con los m茅todos para comunicarnos por Telegram. UniversalTelegramBot bot(BOT_TOKEN, clienteWiFi); // Crea el objeto bot para comunicar por WiFi (a traves del objeto client) y el bot de Telegram (con su Token).

//* PONER AQUI DATOS WIFI *****//

const char* WIFI_SSID = "*"; const char WIFI_PASSWORD = ""; String tickerUno = "BNB-EUR"; String tickerDos = "BTC-EUR"; //**//

//Comandos aceptados const String COMIENZO = "/start"; const String BNB_EUR = "馃捁Cotiz.BNB-EUR"; const String BTC_EUR = "馃捁Cotiz.BTC-EUR"; const String ACTALARMA_BNB_MIN = "鈿燨N Aviso BNB Min"; const String ACTALARMA_BTC_MIN = "鈿燨N Aviso BTC Min"; const String ACTALARMA_BNB_MAX = "鈿燨N Aviso BNB Max"; const String ACTALARMA_BTC_MAX = "鈿燨N Aviso BTC Max"; const String CANALARMA_BNB_MIN = "OFF Aviso BNB Min"; const String CANALARMA_BTC_MIN = "OFF Aviso BTC Min"; const String CANALARMA_BNB_MAX = "OFF Aviso BNB Max"; const String CANALARMA_BTC_MAX = "OFF Aviso BTC Max"; const String INFORME = "Informe"; // Otras variables. int contadorAux = 0; uint32_t lastCheckTime = 0; //Tiempo en que fue hecha la 煤ltima comprobaci贸n. String tickerAviso = "Ninguno"; bool tickerMin = false; bool tickerMax = false; String serverName = "https://query1.finance.yahoo.com/v8/finance/chart/"; String token = "?interval=1d"; String ticker1 = "Ninguno";

char displayString[30] = ""; //Busca este string en la cadena que devuelve el get a Yahoo finance: //Hay muchos otros valores que se pueden rescatar como valores al cierre, cierre dia anterior, etc.. char priceString[] = "regularMarketPrice\":"; char endPrice[] = ",\""; const char* PARAM_INPUT_1 = "input1"; const char beforeIndex[] = "<!DOCTYPE HTML>Cuestionario ESP<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><form action=\"/get\">Simbolo Ticker: <input type=\"text\" name=\"input1\"><input type=\"submit\" value=\"Submit\">
Ticker actual:"; const char afterIndex[] = ""; int valorMinimo = 0; int valorMaximo = 0;

String valorCotiz; bool alarmaUno = false; bool alarmaDos = false; bool alarmaUnoActiva = false; bool alarmaDosActiva = false;

void notFound(AsyncWebServerRequest *request) { request->send(404, "text/plain", "Not found"); }

/* Esto solo vale para usar los dos procesadores del ESP32 para pedir informacion y

void setup() { Serial.begin(115200); /*

ifdef ESP32

   clienteWiFi.setCACert(TELEGRAM_CERTIFICATE_ROOT); // A帽ade certificado raiz para api.telegram.org

else

   clienteWiFi.setTrustAnchors(&cert);  //  A帽ade certificado raiz para api.telegram.org

endif

*/

WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100);

// Esto para ESP8266 // Todo esto es para que ESP8266 funcione sin clientWiFi.SetInsecure() // clienteWiFi.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Para ESP32. A帽ade certificado raiz para api.telegram.org // clienteWiFi.setTrustAnchors(&cert); // Para ESP8266. A帽ade certificado raiz para api.telegram.org

// Huella digital de api.telegram.org: https://www.grc.com/fingerprints.htm // const uint8_t fingerprint[20] = { 0xF2,0xAD,0x29,0x9C,0x34,0x48,0xDD,0x8D,0xF4,0xCF,0x52,0x32,0xF6,0x57,0x33,0x68,0x2E,0x81,0xC1,0x90 }; const uint8_t fingerprint[20] = { 0x74,0x79,0xEA,0x92,0x97,0x56,0xA5,0xC7,0x94,0x9B,0x2C,0xDD,0x97,0xB4,0x64,0x15,0x4F,0x23,0xF70,0xFF}; clienteWiFi.setFingerprint(fingerprint); // Hasta aqu铆 para ESP8266

setupWiFi();

//char text[30]; //String IP = WiFi.localIP().toString();

//Esto solo es para utilizar el otro procesador del ESP32 //strcat(text,IP.c_str()); //memcpy(displayString,text,30); //xTaskCreatePinnedToCore(LEDDisplay,"LedDisplay",1000,NULL,1,&Task1,0); //delay(1000);

//Crea la p谩gina web con el cuestionario para preguntar qu茅 ticker escoger. //No la uso por estar conectado por telegram server.on("/", HTTP_GET, [] (AsyncWebServerRequest request){ request->send(200, "text/html", beforeIndex+ticker1+afterIndex); }); server.on("/get", HTTP_GET, [] (AsyncWebServerRequest request) { String inputMessage; String inputParam; // GET input1 value on /get?input1= if (request->hasParam(PARAM_INPUT_1)) { inputMessage = request->getParam(PARAM_INPUT_1)->value(); inputParam = PARAM_INPUT_1; ticker1 = inputMessage; ticker1.toUpperCase();} //else { // inputMessage = "No message sent"; // inputParam = "Ninguno"; //} request->redirect("/"); }); server.onNotFound(notFound); server.begin(); }

void setupWiFi() { Serial.print("Conectando al SSID: "); Serial.println(WIFI_SSID); // Si es placa EsP8266 hacer cliente no seguro para que funcione la libreria Telegram.

clienteWiFi.setInsecure();

//Inicia en modo ESTACION y se conecta a la red WiFi. //WiFi.setSleepMode(WIFI_NONE_SLEEP); // Solo para ESP8266 WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

// Espera mientras no est茅 conectada la red. long tiempoInicialWifi = millis(); while (WiFi.status() != WL_CONNECTED) { //Serial.print("."); //Serial.println(millis()-tiempoInicialWifi); delay(500); // Si tarda mas de 40 segundos en conectar, se resetea el ESP. if (millis() - tiempoInicialWifi > 50000){ //Serial.println("Se har谩 un Reset"); ESP.restart(); } } WiFi.setAutoReconnect(true); WiFi.persistent(false);

IPAddress ip = WiFi.localIP(); // Aqu铆 pongo la ip de este modo (como array) pues poniendo solo ip en el string, sale mal el por el formato ipaddress. //String mensaje = "Conectado a red: " + (String)WIFI_SSID + ", con IP: " + ip[0] + "." + ip[1] + "." + ip[2] + "." + ip[3]; String mensaje = "Conectado a red: " + (String)WIFI_SSID + ", con IP: " + ip.toString(); //Si lleg贸 aqu铆 est谩 conectado a la red WiFi. //Serial.println(); //Serial.print(mensaje); Serial.println(WiFi.localIP()); bot.sendMessage(validSenderIds[0], mensaje, ""); } void handleNewMessages(int numNuevosMensajes) { for (int i=0; i<numNuevosMensajes; i++) //para cada nuevo mensaje. { String chatId = String(bot.messages[i].chat_id); //id del chat que envia el mensaje. String senderId = String(bot.messages[i].from_id); //id del contacto que envia el mensaje. Serial.println("Id del que envi贸 el mensaje: " + senderId); //muestra en el monitor serie el id de quien envi贸 el mensaje. bool validSender = validaUsuario(senderId); //verifica si es de un remitente de la lista de remitentes v谩lidos. if(!validSender) //si no fuera de un remitente v谩lido. { bot.sendMessage(chatId, "Disculpe pero no tiene permiso para su acceso", "HTML"); //envia mensaje que no posee permiso y vuelve sin hacer nada mas. continue; //continua para la proxima interacci贸n del for (va por el pr贸ximo mensaje, no ejecuta el c贸digo abajo) }

String texto = bot.messages[i].text; //texto que lleg贸.
if (texto.equalsIgnoreCase(COMIENZO))
 {
  Serial.println("start");
   handleComienzo(chatId, bot.messages[i].from_name); //muestra las opciones cuando se abre/se inicia el chat.
 }
else if (texto.equalsIgnoreCase(BNB_EUR))
 {
   handleCotizacion(chatId,tickerUno);                              //Env铆a cotizaci贸n 1.
   String mensaje= "Cotizaci贸n: " + String(displayString);
   bot.sendMessage(chatId, mensaje, "");
   char displayString[30] = "";
 }
else if(texto.equalsIgnoreCase(BTC_EUR))
 {
  handleCotizacion(chatId,tickerDos);                              //Env铆a cotizaci贸n 2.
   String mensaje= "Cotizaci贸n: " + String(displayString);
   bot.sendMessage(chatId, mensaje, "");
   char displayString[30] = "";
 }
else if(texto.equalsIgnoreCase(ACTALARMA_BNB_MIN))
 {
   handleActivaAlarmaUnoMin(chatId);                               //Activa una alarma de valores m铆nimos de BNB-EUR

 }
else if(texto.equalsIgnoreCase(ACTALARMA_BTC_MIN))
 {
   handleActivaAlarmaDosMin(chatId);                               //Activa una alarma de valores minimos de BTC-EUR

 }
else if(texto.equalsIgnoreCase(ACTALARMA_BNB_MAX))
 {
   handleActivaAlarmaUnoMax(chatId);                                //Activa una alarma de valores m谩ximos de BNB-EUR

 }
else if(texto.equalsIgnoreCase(ACTALARMA_BTC_MAX))
 {
   handleActivaAlarmaDosMax(chatId);                               //Activa una alarma de valores m谩ximos de BTC-EUR

 }
else if (texto.equalsIgnoreCase(CANALARMA_BNB_MIN))
 {
   handleCancelaAlarmaUnoMin(chatId);                                //Cancela la alarma de valores de BNB-EUR
 }
else if (texto.equalsIgnoreCase(CANALARMA_BTC_MIN))
 {
   handleCancelaAlarmaDosMin(chatId);                               //Cancela las alarma de valores de BTC-EUR
 }
else if (texto.equalsIgnoreCase(INFORME))
 {
   handleInforme(chatId);                    //Env铆a un informe de las cotizaciones y alarmas.
 }
else if (texto.indexOf("B")==0)
 {
    int longNum = texto.length();
    valorMinimo = texto.substring(1,longNum).toInt();
    valorMaximo = 0;
    String mensaje="Nuevo valor m铆nimo " + String(valorMinimo);
    bot.sendMessage(chatId, mensaje,"");
 }
     else if (texto.indexOf("A")==0)
 {
    int longNum = texto.length();
    valorMaximo = texto.substring(1,longNum).toInt(); 
    valorMinimo = 0;
    String mensaje="Nuevo valor m谩ximo " + String(valorMaximo);
    bot.sendMessage(chatId, mensaje,"");
 }
else
 {
   //handleNotFound(chatId);                              //muestra mensaje que la opci贸n no es v谩lida y muestra todas las opciones.
 }

} }

void handleCotizacion(String chatId, String ticker1) { if((WiFi.status()== WL_CONNECTED) && (ticker1 != "Ninguno")){ //if(WiFi.status()== WL_CONNECTED){
HTTPClient http; String serverPath = serverName + ticker1 + token; //Serial.println(serverPath); //http.begin(serverPath.c_str(),"74:79:EA:92:97:56:A5:C7:94:9B:2C:DD:97:B4:64:15:4F:23:F7:FF");

  http.begin(serverPath.c_str());
  int httpResponseCode = http.GET();

  if (httpResponseCode > 0) {
    //Serial.print("Codigo Respuesta HTTP: ");
    //Serial.println(httpResponseCode);
    String payload = http.getString();
    int tmp = payload.indexOf(priceString);
    int tmp2 = payload.indexOf(endPrice,(tmp+20));
    char text[30] = "";
    strcat(text,ticker1.c_str());
    strcat(text," ");
    strcat(text, payload.substring((tmp+20), tmp2).c_str());
    strcat(text," ");
    memcpy(displayString,text,30);
    valorCotiz = payload.substring((tmp+20), tmp2).c_str();
    //Serial.println(displayString);
  }
  else {
    Serial.print("Codigo Error: ");
    Serial.println(httpResponseCode);
  }
  http.end();

} }

void handleActivaAlarmaUnoMin(String chatId) { alarmaUno=true; String mensaje = " Se progamar谩 un aviso si el valor baja,para BNB-EUR,de: " + String(valorMinimo) + "."; bot.sendMessage(chatId, mensaje, ""); tickerAviso=tickerUno; tickerMin=true; tickerMax=false; alarmaUnoActiva = false; } void handleActivaAlarmaDosMin(String chatId) { alarmaDos=true; String mensaje = " Se progamar谩 un aviso si el valor baja, para BTC-EUR, de: " + String(valorMinimo) + "."; bot.sendMessage(chatId, mensaje, ""); tickerAviso=tickerDos; tickerMin=true; tickerMax=false; alarmaUnoActiva = false; }

void handleActivaAlarmaUnoMax(String chatId) { alarmaUno=true; String mensaje = " Se progamar谩 un aviso si el valor sube,para BNB-EUR,de: " + String(valorMaximo) + "."; bot.sendMessage(chatId, mensaje, ""); tickerAviso=tickerUno; tickerMax=true; tickerMin=false; alarmaUnoActiva = false; } void handleActivaAlarmaDosMax(String chatId) { alarmaDos=true; String mensaje = " Se progamar谩 un aviso si el valor sube, para BTC-EUR, de: " + String(valorMaximo) + "."; bot.sendMessage(chatId, mensaje, ""); tickerAviso=tickerDos; tickerMax=true; tickerMin=false; alarmaDosActiva = false; }

void handleCancelaAlarmaUnoMin(String ChatId) { alarmaUno=false; alarmaUnoActiva=false; tickerAviso="Ninguno"; tickerMax=false; tickerMin=false; }

void handleCancelaAlarmaDosMin(String ChatId) { alarmaDos=false; alarmaDosActiva=false; tickerAviso="Ninguno"; tickerMax=false; tickerMin=false; }

void handleInforme (String chatId) { String mensaje = " 路 Informe situaci贸n 路\n"; handleCotizacion(chatId,"BNB-EUR");
mensaje += "路馃捁Cotiz.BNB-EUR: " + String(valorCotiz) + ".\n"; char displayString[30] = ""; handleCotizacion(chatId,"BTC-EUR");
mensaje += "路馃捁Cotiz.BTC-EUR: " + String(valorCotiz) + ".\n"; mensaje += "路鈿燰alor en observaci贸n: "; mensaje += tickerAviso + "\n"; mensaje += "路鈿燰alor m铆nimo a: " + String(valorMinimo) + ".\n"; mensaje += "路鈿燰alor m谩ximo a: " + String(valorMaximo) + ".\n"; bot.sendMessage(chatId, mensaje, ""); }

bool validaUsuario(String senderId) { // Para cada id de usuario que puede interactuar con este bot. for(int i=0; i<SENDER_ID_COUNT; i++) { //Si el id del remitente forma parte de los valores dentro del array devolvemos que es v谩lido. if(senderId == validSenderIds[i]) { return true; } } // Si lleg贸 aqu铆 significa que verific贸 todos los id's y no lo encontr贸 en el array. return false; }

void handleComienzo(String chatId, String fromName) { // Muestra Hola y el nombre del contacto seguido de los mensajes v谩lidos. String mensaje = "Hola, " + fromName + ".\n"; mensaje += getCommands(); bot.sendMessage(chatId, mensaje, "HTML"); //Serial.println("Start"); enviaTeclado(chatId); }

String getCommands() { //String con la lista de mensajes que son v谩lidos y explicaci贸n sobre qu茅 hacer. String mensaje = " 路 Los comandos disponibles son:\n\n"; mensaje += "" + BNB_EUR + ": Cotizaci贸n Bicencoin-Euro.\n"; mensaje += "" + BTC_EUR + ": Cotizacion Bitcoin-Euro.\n"; mensaje += "" + ACTALARMA_BNB_MIN + ": 鈿燗ctiva alarmas BNB min.\n"; mensaje += "" + ACTALARMA_BTC_MIN + ": 鈿燗ctiva alarmas BTC min.\n"; mensaje += "" + ACTALARMA_BNB_MAX + ": 鈿燗ctiva alarmas BNB max.\n"; mensaje += "" + ACTALARMA_BTC_MAX + ": 鈿燗ctiva alarmas BTC max.\n"; mensaje += "" + CANALARMA_BNB_MIN + ": Cancela alarmas BNB min.\n"; mensaje += "" + CANALARMA_BTC_MIN + ": Cancela alarmas BTC min.\n"; mensaje += "" + INFORME + ": Informe Global.\n"; mensaje += "Para activar un valor m铆nimo escribe 'B' seguido del valor que desees m铆nimo.\n"; return mensaje; }

void compruebaValoresAlarmas(String chatId, String tickerAviso) { if (tickerMin){ handleCotizacion(chatId, tickerAviso);
if (tickerAviso == tickerUno){ if (alarmaUno && !alarmaUnoActiva){ if (valorCotiz.toInt() <= valorMinimo){ //Serial.println("minimo"); String mensaje = "鈿燗larma de valor m铆nimo BNB-EUR"; bot.sendMessage(chatId, mensaje,""); alarmaUnoActiva=true; } } } if (tickerAviso == tickerDos){ if (alarmaDos && !alarmaDosActiva){
if (valorCotiz.toInt() <= valorMinimo){ String mensaje = "鈿燗larma de valor m铆nimo BTC-EUR"; bot.sendMessage(chatId, mensaje,""); alarmaDosActiva= true; } } } }

if (tickerMax){
 handleCotizacion(chatId, tickerAviso);     
 if (tickerAviso == tickerUno){
  if (alarmaUno && !alarmaUnoActiva){
   if (valorCotiz.toInt() >= valorMaximo){
      //Serial.println("maximo");
     String mensaje = "鈿燗larma de valor m谩ximo BNB-EUR";
     bot.sendMessage(chatId, mensaje,"");
     alarmaUnoActiva=true;
   }
  }
 }
 if (tickerAviso == tickerDos){
  if (alarmaDos && !alarmaDosActiva){      
   if (valorCotiz.toInt() >= valorMaximo){
     String mensaje = "鈿燗larma de valor m谩ximo BTC-EUR";
     bot.sendMessage(chatId, mensaje,"");
     alarmaDosActiva= true;
   }
  }
 }
}    

}

void loop() {

// Comprueba si la WiFi est谩 activa, sino la reconecta. Si tarda mas de 200 vueltas de programa sin reconectar, reinicia ESP. if((WiFi.status() !=WL_CONNECTED) && (contadorAux<200)){ //Serial.print("Wifi desconectada"); //Serial.println(contadorAux++); contadorAux++; WiFi.reconnect(); delay(3000); } if ((WiFi.status() !=WL_CONNECTED) && (contadorAux>=300)){ //Serial.println("Se har谩 un Reset"); ESP.restart(); } if ((WiFi.status() == WL_CONNECTED) && (contadorAux>0)){ contadorAux = 0; //Serial.println("Wifi CONECTADA"); }

// Esto era para que al reiniciarse envie el teclado de botones pero para eso ya est谩 la funcion /start. / if (inicio){ enviaTeclado(); inicio=false; } /

//Tiempo ahora desde el inicio. uint32_t ahora = millis(); //Si el tiempo pasado desde la 煤ltima comprobaci贸n fue mayor que el intervalo establecido. if (ahora - lastCheckTime > intervalo1Seg) { //Coloca el tiempo de 煤ltima comprobaci贸n como actual y comprueba si hay mensajes nuevos. lastCheckTime = ahora; int numNuevosMensajes = bot.getUpdates(bot.last_message_received + 1); handleNewMessages(numNuevosMensajes); //Serial.print("nuevos mensajes:"); //Serial.print(numNuevosMensajes); } if (alarmaUno || alarmaDos){ compruebaValoresAlarmas(validSenderIds[0], tickerAviso); } }

void enviaTeclado(String chatId) { // sendMessageWithReplyKeyboard botones debajo de zona de escritura. String keyboardJson = "[[\"馃捁Cotiz.BNB-EUR\",\"馃捁Cotiz.BTC-EUR\"],"; keyboardJson += "[ \"鈿燨N Aviso BNB Min\", \"鈿燨N Aviso BTC Min\" ],"; keyboardJson += "[ \"鈿燨N Aviso BNB Max\", \"鈿燨N Aviso BTC Max\" ],"; keyboardJson += "[ \"OFF Aviso BNB\", \"OFF Aviso BTC\" ],"; keyboardJson += "[ \"Informe\"]]"; bot.sendMessageWithReplyKeyboard(chatId, "Selecciona tu petici贸n:", "", keyboardJson, true); }

Patrick-E-Rankin commented 3 years ago

Well it looks like the RSA fingerprint was updated. But here it is @lorenzobarrio and @eqamppp https://github.com/Patrick-E-Rankin/ESP8266-STOCK-CRYPTO-OLED