Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Notificaciones en plan simple
#1
Cuando hace un tiempo se habló de notificaciones, gráfica s, etc, Almagar nos explicó lo complicado que era todo el tema de las notificaciones push.

Tras esto, he buscado alternativas para tener notificaciones, tipo pushbullet, etc. Todas me parecieron complicadas o poco viables por ser de pago, con la obligación de crear registros, etc.

Hoy he probado IFTTT, ya que todo el mundo la pone por las nubes para programar eventos y acciones en android. La verdad es que lo poco que he probado me ha parecido super práctica, y asequible para todos nosotros, que estamos acostumbrados a realizar programaciones en domuino.

Lo primero que he comprobado,de manera extraordinariamente sencilla, es que tiene notificaciones. Me he tenido que registrar usando la cuenta de Google o Facebook. Es súper sencillo y no hay que andar recordando nuevos usuarios y contraseñas.

He conseguido crear un widget que al pulsarlo manda una notificación.

Vale, la mitad del trabajo está hecha. Ahora el problema es cómo mandar cosas desde el Arduino a las notificaciones IFTTT.

Sin rascar demasiado en la app he encontrado un plugin llamado webhooks. Te asigna un ID, y con ese id metido en una URL puedes generar eventos, incluso con variables. El resultado es una url que incluye la id, el evento y opcionalmente las variables.

En IFTTT hay que crear el applet que captura el evento.

Tengo que decir que no soy un lince y ha sido mi primera toma de contacto con la app. Así que cumple que tiene que ser extremadamente sencillo.

La petición es poder tener dentro de domuino la posibilidad de ejecutar una URL con el id de usuario, evento y variables. Podría ser un tipo como los comandos que no se están usando en la app, o meter el texto directamente en la programación...
Responder
#2
Continuando con mis indagaciones para conseguir notificaciones, me he introducido en el curioso mundo de los bots de Telegram. Un bot no es más que un usuario "virtual" que puede mandar notificaciones a usuarios y/o grupos. Yo solo he probado con usuarios.

Resulta que buscas un usuario (bot) de Telegram llamado BotFather y le escribes /newbot y te pide que le des nombre a tu nuevo bot y también un usuario para él. Una vez finalizado el proceso, te asigna un token, que no es más que una serie de letras y número únicos, la identificación única de tu bot. Apuntamos el TOKEN.

Ya tenemos el bot, el origen de los mensajes, y necesitamos el destinatario. Aquí tenemos que coger el móvil android (mi caso, aunque imagino que iphone tendrá algo silar), entrar en las opciones, cuentas, telegram, y ahí tienes tu identificador de destinatario, un número de unos 10 dígitos. Apuntamos el IDENTIFICADOR.

Para enviar una notificación de texto, desde tu explorador de internet habitual, hay que teclear una url con la siguiente información, unida sin espacios:

https://api.telegram.org/bot
[TOKEN]
/SendMessage?chat_id=
[IDENTIFICADOR]
&text=
[Mensaje de texto]


El [Mensaje de texto] es lo que nos aparecerá como notificación, no necesita ir entre comillas y admite espacios.

Y con esto nos llega una notificación al Telegram de nuestro bot.

Aprovechando el parón que estamos obligados a tener he intentado hacerme un script de arduino para tener un mini+ethernet conectando sus entradas a las salidas de uno de mis nodos de domuino y programar eventos para que pueda enviar 10 notificaciones distintas usando 10 entradas digitales pero he de decir que soy bastante inútil y no soy capaz, al menos de momento, de tener nada mínimamente funcional.

Eso sí, no me rindo, tampoco parece difícil, que cada cambio Low>High genere una url distinta, haciendo la combinación descrita arriba, con sus correspondiente texto.

Aunque estaría bien que se integrara en domuino, ya que la creación del bot es fácil (hasta demasiado, diría yo), y para alguien que sepa, como es el caso de almagar/monly, no creo que sea complicado de programar (o si, quien sabe), esperemos que haya espacio suficiente para ello en la programación.
Responder
#3
He sido capaz de generar el programa que detecta los flancos de activación de las 10 señales (en plan programación-chorizo, bastante poco elegante), y he comenzado con el tema de la comunicación con el bot.

Me he topado con 2 problemas, el primero es que la comunicación con el bot tiene que ser mediante https, y estoy usando un pro-mini + ethernet w5100 en formato pequeño, no la típica de encajar sobre el mega. Y uso la biblioteca ethernet "estandar" que viene en el IDE. Por lo que he leido, no es tan sencillo como mandar la información a otro puerto, hay que gestionar el cifrado de los datos, y por lo visto la w5100 no lo hace, y no hay una biblioteca que lo haga, básicamente porque estos arduinos no tienen capacidades suficientes (por lo visto ni procesamiento ni almacenamiento). La altenativa es usar un arduino que venga provisto de wifi, que tienen capacidad de gestionar conexiones cifradas. UN ESP32, NODEMCU, por ejemplo. Son módulos que no he usado nunca, pero con estas bibliotecas el bot nos puede funcionar bidireccionamente, por ejemplo hacer comandos para ejecutar desde el móvil, al márgen de la domótica (hacer un hardreset por ejemplo).

El segundo problema es que por más que lo intento no soy capaz de entender el lenguaje html y como se debe comunicar usando el arduino. SUpongo que con tiempo lo acabaría pillando, pero tampoco he encontrado información clara en los foros de arduino, y lo que he probado, pues no ha funcionado.

De todas formas, cuelgo el código que he hecho por si alguien me lee y es capaz de dar con la tecla:

Código:
#include <SPI.h>
#include <Ethernet.h>

// pines ethernet SPI en arduino pro-mini: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK)
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
char server[] = "http://api.telegram.org";
EthernetClient client;

String servidor = "GET /bot";
String token = "0000000000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; //token del bot
long chat_id=1234567890; //cuenta del usuario que recibe los mensajes

String aviso_0 = "Mensaje 0";
String aviso_1 = "Mensaje 1";
String aviso_2 = "Mensaje 2";
String aviso_3 = "Mensaje 3";
String aviso_4 = "Mensaje 4";
String aviso_5 = "Mensaje 5";
String aviso_6 = "Mensaje 6";
String aviso_7 = "Mensaje 7";
String aviso_8 = "Mensaje 8";
String aviso_9 = "Mensaje 9";

String cadena;

const int  Entrada0 = 2;
const int  Entrada1 = 3;
const int  Entrada2 = 16; //el pin 4 se usa para el control de la SD, aunque el módulo que uso no la tiene lo dejo libre por si acaso
const int  Entrada3 = 5;
const int  Entrada4 = 6;
const int  Entrada5 = 7;
const int  Entrada6 = 8;
const int  Entrada7 = 9;
const int  Entrada8 = 14;
const int  Entrada9 = 15;

int EstadoEntrada0= 1;
int EstadoEntrada1= 1;
int EstadoEntrada2= 1;
int EstadoEntrada3= 1;
int EstadoEntrada4= 1;
int EstadoEntrada5= 1;
int EstadoEntrada6= 1;
int EstadoEntrada7= 1;
int EstadoEntrada8= 1;
int EstadoEntrada9= 1;

int EstadoAnteriorEntrada0= 1;
int EstadoAnteriorEntrada1= 1;
int EstadoAnteriorEntrada2= 1;
int EstadoAnteriorEntrada3= 1;
int EstadoAnteriorEntrada4= 1;
int EstadoAnteriorEntrada5= 1;
int EstadoAnteriorEntrada6= 1;
int EstadoAnteriorEntrada7= 1;
int EstadoAnteriorEntrada8= 1;
int EstadoAnteriorEntrada9= 1;

void setup() {

 Serial.begin(9600);

 pinMode(Entrada0, INPUT_PULLUP);
 pinMode(Entrada1, INPUT_PULLUP);
 pinMode(Entrada2, INPUT_PULLUP);
 pinMode(Entrada3, INPUT_PULLUP);
 pinMode(Entrada4, INPUT_PULLUP);
 pinMode(Entrada5, INPUT_PULLUP);
 pinMode(Entrada6, INPUT_PULLUP);
 pinMode(Entrada7, INPUT_PULLUP);
 pinMode(Entrada8, INPUT_PULLUP);
 pinMode(Entrada9, INPUT_PULLUP);

 Serial.println("Iniciando...");
 Ethernet.begin(mac, ip);
 
 delay(2000); //Por si se reinicia el nodo y cambian de estado sus salidas, que espere lo suficiente antes de mandar notificaciones
 
 if (client.connect(server, 80)) {
   Serial.print("Conectado a ");
   Serial.println(server);
 }
 cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=Domotica iniciada HTTP/1.1";
 client.println(cadena);
 client.println("Host: http://api.telegram.org");
 client.println("Connection: close");
 client.println();
}



void loop()
{
 EstadoEntrada0 = digitalRead(Entrada0);
 EstadoEntrada1 = digitalRead(Entrada1);
 EstadoEntrada2 = digitalRead(Entrada2);
 EstadoEntrada3 = digitalRead(Entrada3);
 EstadoEntrada4 = digitalRead(Entrada4);
 EstadoEntrada5 = digitalRead(Entrada5);
 EstadoEntrada6 = digitalRead(Entrada6);
 EstadoEntrada7 = digitalRead(Entrada7);
 EstadoEntrada8 = digitalRead(Entrada8);
 EstadoEntrada9 = digitalRead(Entrada9);
 
 if (EstadoEntrada0 != EstadoAnteriorEntrada0 && EstadoEntrada0 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_0;
   Serial.println(cadena);
 }
 
 if (EstadoEntrada1 != EstadoAnteriorEntrada1 && EstadoEntrada1 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_1;
   Serial.println(cadena);
 }
 
 if (EstadoEntrada2 != EstadoAnteriorEntrada2 && EstadoEntrada2 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_2;
   Serial.println(cadena);
 }
 
 if (EstadoEntrada3 != EstadoAnteriorEntrada3 && EstadoEntrada3 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_3;
   Serial.println(cadena);
 }
 
 if (EstadoEntrada4 != EstadoAnteriorEntrada4 && EstadoEntrada4 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_4;
   Serial.println(cadena);
 }
 
 if (EstadoEntrada5 != EstadoAnteriorEntrada5 && EstadoEntrada5 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_5;
   Serial.println(cadena);
 }
 
 if (EstadoEntrada6 != EstadoAnteriorEntrada6 && EstadoEntrada6 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_6;
   Serial.println(cadena);
 }

 if (EstadoEntrada7 != EstadoAnteriorEntrada7 && EstadoEntrada7 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_7;
   Serial.println(cadena);
 }

 if (EstadoEntrada8 != EstadoAnteriorEntrada8 && EstadoEntrada8 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_8;
   Serial.println(cadena);
 }

 if (EstadoEntrada9 != EstadoAnteriorEntrada9 && EstadoEntrada9 == HIGH) {
   cadena = servidor + token + "/sendMessage?chat_id=" + chat_id + "&text=" + aviso_9;
   Serial.println(cadena);
 }

 EstadoAnteriorEntrada0 = EstadoEntrada0;
 EstadoAnteriorEntrada1 = EstadoEntrada1;
 EstadoAnteriorEntrada2 = EstadoEntrada2;
 EstadoAnteriorEntrada3 = EstadoEntrada3;
 EstadoAnteriorEntrada4 = EstadoEntrada4;
 EstadoAnteriorEntrada5 = EstadoEntrada5;
 EstadoAnteriorEntrada6 = EstadoEntrada6;
 EstadoAnteriorEntrada7 = EstadoEntrada7;
 EstadoAnteriorEntrada8 = EstadoEntrada8;
 EstadoAnteriorEntrada9 = EstadoEntrada9;
 
 delay(50); // para evitar rebotes

}

Este código es un despropósito de recursos, estoy seguro de que se puede hacer mucho más funcional, elegante y profesional (y que funcione...), pero doy para lo que doy.

Si os fijais estoy intentando comunicarme por el bot mediante http en vez de https, y por el puerto 80. Tenía una leve esperanza de obtener algún resultado pero no he podido. Faltaría replicar el código en cada detección (en realidad tendría que haber hecho una función), pero al no ser capaz de que funcione en el reinicio era tontería seguir en las detecciones. Ahí lo dejo a ver si alguien recoje el guante.

Un saludo, y a ver si se anima esto!!!!
Responder
#4
Como he conseguido echar a andar el ProMini para notificaciones con IFTTT, abro un hilo en soluciones, para matener un orden:

http://www.domuino.es/foro/showthread.php?tid=1161
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)