TELEGRAM Y RAPSBERRY Referencias: Telegram Bot with Raspberry PI: https://www.hackster.io/Salman_faris_vp/telegram-bot-with-raspberry-pi-f373da Creando bots para Telegram para automatizar respuestas: https://www.hackster.io/Salman_faris_vp/telegram-bot-with-raspberry-pi-f373da Como ejecutar un program automáticamente al arrancar la Raspberry PI: https://nideaderedes.urlansoft.com/2013/12/20/como-ejecutar-un-programa-automaticamente-al-arrancar-la-raspberry-pi/ 1. Instalar Telegram en su móvil 2. Telegram tiene un bot para crear bots llamado BotFather, buscar en Telegram y pulsar sobre éste para iniciar una conversación. 3. Iniciar BotFather con /start 4. Crear un bot en BotFather enviando el mensaje: /newbot 5. A continuación BotFather preguntará: * El nombre visible del bot: Cascabel * El nombre público del bot, éste tiene que terminar en bot o _bot, como pasa con los dominios es posible que el nombre ya esté registrado: Cascabeltelegrambot 6. Si todo ha salido bien devolverá un token que usaremos para interactuar con nuestro bot, por ejemplo: 342025387:AAHVGuFiL2z3uX9M5e9hc9OXZI-SUbS8GUc (este token es inventado) 7. Instalar en la Raspberry "Python Package Index": sudo apt-get install python-pip 8. Instalar "telepot": sudo pip install telepot 9. Obtener el Código Python: git clone https://github.com/salmanfarisvp/TelegramBot.git Con el anterior comando, se crea el directorio TelegramBot. Dentro de ese directorio se encuentra el archivo telegrambot.py: import import import import import import sys time random datetime telepot RPi.GPIO as GPIO #Encendido y apagado de LED en el pin físico 40 def on(pin): GPIO.output(pin,GPIO.HIGH) return def off(pin): GPIO.output(pin,GPIO.LOW) return # Sistema de numeración de la Raspberry Pi GPIO.setmode(GPIO.BOARD) # Configurar pin 40 como salida GPIO.setup(40, GPIO.OUT) def handle(msg): chat_id = msg['chat']['id'] command = msg['text'] print 'Got command: %s' % command if command == 'On': bot.sendMessage(chat_id, on(40)) elif command =='Off': bot.sendMessage(chat_id, off(40)) bot = telepot.Bot('342025387:AAHVGuFiL2z3uX9M5e9hc9OXZI-SUbS8GUc') bot.message_loop(handle) print 'I am listening...' while 1: time.sleep(10) Ejecutar telegrambot.py: python telegrambot.py Iniciamos nuestro bot: Cascabel /start Enviamos las palabras On y Off CREAR PROCESO, VERLO Y ELIMINARLO Crear: Python telegrambot.py & Ver: ps aux Eliminar: pkill -f telegrambot.py EJECUTAR UN PROGRAMA AL ARRANCAR LA RASPBERRY El primer paso es crear un script que se encargue de arrancar nuestro software de manera automática. En nuestro caso era el script detector-init (para poner en marcha automáticamente un sensor de presencia). Para crearlo hacemos: sudo nano /etc/init.d/detector-init Y copiamos el siguiente contenido: #! /bin/sh # /etc/init.d/detector-init ### BEGIN INIT INFO # Provides: # Required-Start: # Required-Stop: # Default-Start: # Default-Stop: # Short-Description: # Description: ### END INIT INFO detector-init $all $remote_fs $syslog 2 3 4 5 0 1 6 Script de ejemplo de arranque automático Script para arrancar el detector de presencia # Dependiendo de los parámetros que se le pasen al programa se usa una opción u otra case "$1" in start) echo "Arrancando detector-init" # Aquí hay que poner el programa que quieras arrancar automáticamente /usr/bin/python /home/pi/telegrambot.py ;; stop) echo "Deteniendo detector-init" ;; *) echo "Modo de uso: /etc/init.d/detector-init {start|stop}" exit 1 ;; esac exit 0 Un par de aclaraciones: # Required-Start: $all – Con esto indicamos al sistema que primero cargue todos los demás módulos. # Default-Start: 2 3 4 5 – Aquí le decimos al sistema en qué run levels queremos que se ponga en marcha nuestro script. Ahora hacemos el fichero ejecutable: sudo chmod 755 /etc/init.d/detector-init Comprobamos que todo se ejecuta correctamente: sudo /etc/init.d/detector-init start Y por último activamos el arranque automático: sudo update-rc.d detector-init defaults Cuando se reinicie la Raspberry debería empezar a funcionar el programa de forma automática. Podemos comprobarlo haciendo: ps aux | grep "telegrambot.py" (Porque detector.py es el programa que pone en marcha el script detector-init). Como llamamos en Telegram a /on y /off: PRUEBA DEL TOKEN En la consola de la Raspberry: python import telepot bot = telepot.Bot('342025387:AAHVGuFiL2z3uX9M5e9hc9OXZI-SUbS8GUc') bot.getMe() La respuesta es: username: Cascabeltelegrambot first_name: Cascabel id: 342025387 TELEGRAM Y NODEMCU #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #define BOTtoken "476599401:AAHejGzJ994y8FhsJUu98-niapEMmLizU5g" #define LED_BUILTIN 2 WiFiClientSecure client; UniversalTelegramBot bot(BOTtoken, client); String id, text; unsigned long tiempo; void setup(){ pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, 1); WiFi.mode(WIFI_STA); connect(); } void loop(){ if (millis() - tiempo > 1000){ connect(); readTel(); tiempo = millis(); } } void connect(){ if (WiFi.status() != WL_CONNECTED){ WiFi.begin("COMTECO-95084648", "DNGEL24641"); delay(2000); } } void readTel(){ int newmsg = bot.getUpdates(bot.last_message_received + 1); for (int i = 0; i < newmsg; i++){ id = bot.messages[i].chat_id; text = bot.messages[i].text; text.toUpperCase(); if (text.indexOf("ON") > -1){ digitalWrite(LED_BUILTIN, 0); bot.sendMessage(id, "LED ON", ""); } else if (text.indexOf("OFF") > -1){ digitalWrite(LED_BUILTIN, 1); bot.sendMessage(id, "LED OFF", ""); } else if (text.indexOf("START") > -1){ bot.sendSimpleMessage(id, id, ""); } else { bot.sendSimpleMessage(id, "Comando Invalido", ""); } } } #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #define BOTtoken "476599401:AAHejGzJ994y8FhsJUu98-niapEMmLizU5g" //Token de "su" bot #define LED_BUILTIN 2 //Led en la placa - pin2 WiFiClientSecure client; UniversalTelegramBot bot(BOTtoken, client); String id, text; unsigned long tiempo; //Variables para almacenar el ID y TEXTO generado por el Usuario void setup() { pinMode(LED_BUILTIN, OUTPUT); WiFi.mode(WIFI_STA); connect(); } void loop() { if (millis() - tiempo > 2000) { connect(); readTel(); tiempo = millis(); } } //pin2 salida //WiFi como Estación de trabajo //Función para Conectar al WiFi //verifica las funciones cada 2 segundos //Función para verificar si hay conexión //Función para leer Telegram //Reset al tiempo void connect() //Función para Conectar al wifi y verificar la conexión { if (WiFi.status() != WL_CONNECTED) //si no está conectado al WiFi, se conecta { WiFi.begin("COMTECO-95084648", "DNGEL24641"); //datos de la red delay(2000); } } void readTel() //Función que hace la lectura de Telegram { int newmsg = bot.getUpdates(bot.last_message_received + 1); for (int i = 0; i < newmsg; i++) { id = bot.messages[i].chat_id; text = bot.messages[i].text; text.toUpperCase(); //para X mensajes nuevos, loop X veces //almacena ID del Usuario en variable //almacena texto del usuario en variable //STRING_TEXT a mayúscula if (text.indexOf("ON") > -1) { digitalWrite(LED_BUILTIN, 0); bot.sendMessage(id, "LED ON", ""); } //si el texto recibido contiene "ON" else if (text.indexOf("OFF") > -1) { digitalWrite(LED_BUILTIN, 1); bot.sendMessage(id, "LED OFF", ""); } // si el texto recibido contiene "OFF" else if (text.indexOf("START") > -1) { bot.sendSimpleMessage(id, id, ""); } //si el texto recibido contiene "START" //enciende LED //envia mensaje //apaga LED //envia mensaje //envia mensaje con su ID Else //si texto no es ninguno de los anteriores, mensaje de error { bot.sendSimpleMessage(id, "Comando Invalido", ""); } } }