Raspberry Pi: Nachrichten und Fotos mit Telegram versenden

Ich habe einen Weg gesucht, damit meine eigene Kamera mich benachrichtigt, wenn etwas passiert.

Dazu sollte eine Push-Benachrichtigung auf dem Smartphone ankommen. Gelöst habe ich das mit Hilfe von Telegram und der Anleitung von einem anderen Blogger, der ebenfalls auf das RPi-Cam-Web-Interface setzt. Folgendes ist zu tun:

Telegram-Bot einrichten

Telegram ermöglicht mit Hilfe der Bots das Versenden von Nachrichten und Bildern. Ladet euch die App aus eurem App Store oder den Desktop-Client herunter und installiert entsprechend.

Mit Hilfe des Botfather kann dann ein neuer Bot angelegt werden. Die Anleitung gibt es bei Telegram: https://core.telegram.org/bots#6-botfather
Merkt euch den API-Token und Bot Username (endet auf bot).

Anschließend muss die Chat-ID ermittelt werden. Gebt dazu folgenden Request in eurem Browser ein, wobei ihr euren Token benutzt:

https://api.telegram.org/botReplaceThisWithTheBotFatherToken/getUpdates

Aus der Antwort benötigen wir die „id“ (im Beispiel 987654321):

"message":{"message_id":2872,"from":{"id":987654321,

Da wir nun API Token und Chat-id haben, können wir eine Test-Nachricht versenden. Geht dazu in die Konsole des Raspberry Pis und gebt folgendes ein, wobei wiederum Token und Chat-ID entsprechend zu ändern sind):

curl -s -X POST https://api.telegram.org/bot123456789:jekcjrnekjrhteuncheiucnf/sendMessage -d text="A message from your bot" -d chat_id=987654321

Bei Erfolg kommt eine Nachricht auf eurem Telegram Client an.

Versand als Skript verpacken

Um diese Funktion automatisch zu nutzen, muss das ganze noch in ein Skript verpackt werden. Legt dazu zuerst folgendes Config-File an:

sudo nano /var/www/html/macros/configfile.cfg

Anschließend fügt ihr darin folgendes ein:

#!/bin/bash
  
#Replace text within and including the arrow brackets <> with your own details
  
#Camera details
cameraName="<Mycam>"  
  
#Telegram details
tokenurl="https://api.telegram.org/bot<your API key>"
chatid="<your chat id>"
  
#Folder paths
webfolder="/var/www/html"
nomsg="/home/pi/nomsgfile.lck"
logfile="${webfolder}/scheduleLog.txt"
curlout="${webfolder}/curlout.txt"  #Keeps a log of the curl output for troubleshooting
  
  
#Logging function
logging () {
  #logging yes true "This is my error message"
  #$1 yes/no - send telegram msg
  #$2 true/false - disable audible notification or pop-up msg on receiving device
  
  ext="$1"
  notification="$2"
  msg="$3"
  
  NOW="`date +"-%Y/%m/%d %H:%M:%S-"`"
  echo "$msg"
  echo "${NOW} ${msg}" >> $logfile
  if [ $ext == "yes" ]; then
    curl -s \
      -X POST \
      ${tokenurl}/sendMessage \
      -d text="$msg" \
      -d disable_notification=${notification} \
      -d chat_id=${chatid} >> ${curlout} &
  fi
}

Das eigentliche Skript zum Nachrichtenversand wird jetzt angelegt:

sudo nano /var/www/html/macros/motion_event.sh

und enthält folgendes:

#!/bin/bash
. /var/www/html/macros/configfile.cfg
  
#If you wish to disable notifications, create a file using "touch /home/pi/nomsgfile.lck"
if [ -f $nomsg ]; then
  logging no true "Message alerting has been disabled, exiting..."
exit
fi
  
#Copy the low res snapshot image from memory to a file
cp /dev/shm/mjpeg/cam.jpg ${webfolder}/cam_new.jpg
  
#On motion detection start (parameter is 1 for on, 0 for off)
fileparams=$1
if [ $fileparams -eq 1 ]
then
  #Send both a single text message and a photo because sometimes the photo message times out if the Telegram servers are busy
   
  logging yes false "Motion detected from ${cameraName}"
  
  curl -s -X POST \
    ${tokenurl}/sendPhoto \
    -F chat_id=${chatid} \
    -F photo="@${webfolder}/cam_new.jpg" \
    -F caption="Motion detected on ${cameraName}" >> ${curlout} &
  
fi

Damit das Skript ausgeführt werden kann, muss es noch ausführbar gemacht und die Ownerschaft angegeben werden:

sudo chmod +x /var/www/html/macros/motion_event.sh
sudo chown www-data:www-data /var/www/html/macros/motion_event.sh
sudo chown www-data:www-data /var/www/html/macros/configfile.cfg

Skript aufrufen

Das Skript kann nun aufgerufen werden, um Nachrichten zu versenden. Damit das aus dem RPi Web Cam Interface geschieht, muss der „Motion Detect Mode“ auf Internal oder Monitor gesetzt werden. „Internal“ benutzt den internen Modus zur Bewegungserkennung, wobei Bilder und Videos aufgezeichnet werden. „Monitor“ benutzt die gleiche Bewegungserkennung, zeichnet aber nichts auf. Ich habe mich für diese Einstellung entschieden, da mir die Benachrichtigung ausreicht, ich keine Aufzeichnungen benötige und damit auch nicht immer wieder den Speicher löschen brauche.

ToDo: Bot für mehrere Nutzer verfügbar machen

Das oben beschriebene Skript arbeitet nur mit einer Chat-ID. Dadurch kann nur ein Telegram-Account die Nachrichten empfangen. Den Bot für mehrer Nutzer verfügbar zu machen, steht daher noch auf meiner ToDo-Liste.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.