Den RasPi per Telegram Messenger steuern und Nachrichten versenden

Update 30.05.2020: getestet in Raspberry Pi OS (Version: May 2020)

Auf dieser Seite will ich darauf eingehen, wie man mit dem Raspberry Pi Telegram Nachrichten versenden kann und auch mittels Telegram Nachrichten den Raspberry Pi steuern kann.

Für alle, die die WhatsApp Alternative nicht kennen: https://telegram.org/

einen Bot mit Botfaher einrichten

als erstes verbinden wir uns mit dem Botfather, indem wir im Telegram unten einfach @botfather eingeben.
Der Botfather öffnet sich und zeigt die verfügbaren Kommandos an.

tet

wir wollen einen neuen Bot erstellen, also /newbot

nun vergeben wir einen Namen für unseren Bot z.B. TestBoht

wir brauchen noch einen Usernamen, der auf “bot” endet, also TestBoht_bot

so, wir haben einen neuen Bot “geschaffen”, es wird ein Token angezeigt, mit dem wir auf den Bot zugreifen können. Diesen Token notieren wir uns, den brauchen wir später wieder. Vom Format her schaut der so in der Art aus:
123456789:AaFWearrrit9nnbArajrMrELsln7tthnnS4
Im Bild ist das der geschwärzte Bereich:

So, der Bot existiert! Bevor wir weitermachen, müssen wir unbedingt den Bot starten. Das machen wir indem wir in der letzen Nachricht des Botfather hierhin drücken:

Ein neuer Chat geht auf, unten drücken wir auf “Start”

Zum Schluss müssen wir noch die Chat-ID ermitteln. Dies geht folgendermassen:
curl -X POST https://api.telegram.org/bot123456789:AaFWearrrit9nnbArajrMrELsln7tthnnS4/getUpdates
hier müsst ihr natürlich euren richtigen Token einsetzen.

Die Ausgabe schaut folgendermassen aus:

{"ok":true,"result":[{"update_id":xxxxxxxxx,
"message":{"message_id":3,"from":{"id":9876543231,"is_bot":false,"first_name":.........

=> in der zweiten Zeile steht hinter dem "id": eure Chat-ID; in diesem Fall ist es die 9876543231

eine Nachricht an den Bot schicken

für das Versenden einer Nachricht an unseren Bot aus der Befehlszeile geben wir einfach diesen Befehl ein (wird als 2 Zeilen dargestellt, ist aber eine):
curl -X POST 'https://api.telegram.org/bot123456789:AaFWearrrit9nnbArajrMrELsln7tthnnS4/sendMessage?chat_id=9876543231&text="texty text"'

hier müsst ihr natürlich euren Token, eure Chat-ID und die gewünschte Nachricht eintragen.

Soweit so gut, denkbare Anwendungen wären hier:

  • wenn ein GPIO überbrückt wird (z.B. Türkontakt), wird eine Telegram Nachricht verschickt.
  • bei Neustart wird eine Telegram Nachricht verschickt. (via cronjob)
  • usw.

Eine Installtion von Software auf dem Raspberry Pi ist für das Versenden von Nachrichten an den Bot nicht notwendig!!!!

mit einer Telegram Nachricht an den Bot den Raspberry Pi steuern

für die Steuerung vom Raspberry Pi ist die Software “telepot” notwendig, die wir zuerst installieren:

sudo apt-get install python-pip 
sudo pip install telepot

danach erstellen wir ein python script mit folgendem Inhalt:

nano telegram.py wir starten den Editor und fügen folgenden Inhalt ein:

#!/usr/bin/env python
#coding: utf8 

import time, datetime
import telepot 
from telepot.loop import MessageLoop
import os
import RPi.GPIO as GPIO

now = datetime.datetime.now()

def action(msg):
    chat_id = msg['chat']['id']
    command = msg['text']

    print 'Received: %s' % command

    if command == '/hi':
        telegram_bot.sendMessage (chat_id, str("Hihoy, Schweinebacke :-)"))
    elif command == '/time':
        telegram_bot.sendMessage(chat_id, str(now.hour)+str(":")+str(now.minute))
    elif command == '/logo':
        telegram_bot.sendPhoto (chat_id, photo = "https://jekyllrb.com/img/logo-2x.png")
    elif command == '/file':
        telegram_bot.sendDocument(chat_id, document=open('/home/pi/telegram.py'))
    elif command == '/audio':
        telegram_bot.sendAudio(chat_id, audio=open('/home/pi/test.mp3'))
    elif command == '/gpio':
		GPIO.setmode(GPIO.BCM)
		GPIO.setup(21, GPIO.OUT)
		for i in range(5):
			GPIO.output(21, GPIO.HIGH)
			time.sleep(0.5)
			GPIO.output(21, GPIO.LOW)
			time.sleep(0.5)
		GPIO.cleanup()
    elif command == '/restart':
		print "RasPi Neustart"
		os.system("sudo shutdown -r now")
		sys.exit()
		
		
telegram_bot = telepot.Bot('123456789:AaFWearrrit9nnbArajrMrELsln7tthnnS4')
print (telegram_bot.getMe())

MessageLoop(telegram_bot, action).run_as_thread()
print 'Up and Running....'

# Keep the program running.
while 1:
    time.sleep(10)

gestartet wird das python Script mit:
python telegram.py

Zur Erklärung:

  • mit /hi wird die Nachricht mit einem vorgegebenen Text (hier: Hihoy, Schweinebacke :-)) beantwortet
  • mit /time wird die Uhrzeit zurückgeschickt
  • mit /logo wird ein Bild verschickt
  • mit /file wird eine Datei verschickt
  • mit /audio wird eine Audiodatei verschickt
  • mit /gpio wird GPIO21 im 0,5 sec. Takt 5x ein und ausgeschaltet
  • mit /restart wird das System neu gestartet

weiter unten in der Zeile telegram_bot = telepot.Bot muss vorher der Token vom Bot eingetragen werden!!!

In dem Script sind einige Möglichkeiten eingearbeitet, daraus lässt sich einiges basteln :-)
Dieses Script kann man z.B. über einen cronjob starten und so permanent laufen lassen…
Statt den fest definierten Dateien kann man auch mit Variablen arbeiten, und sich etwa aktuelle Bilder von einer Kamera schicken lassen.