Skip to Content

ESP32 sendet Telegram-Nachricht

ESP32 sendet Telegram-Nachricht

In diesem Artikel zeige ich dir, wie du einen ESP32 dazu bringst, eine Telegram-Nachricht an die Telegram App auf deinem Handy oder Computer zu senden. Außerdem fügen wir dem ESP32 einen Passiv-Infrarot-Sensor (PIR) hinzu, der eine Einbruchsmeldung senden kann, wenn eine Bewegung erkannt wird.

Benötigte Teile

Unten findest du die benötigten Komponenten. Für dieses Projekt habe ich ein älteres ESP32-Board verwendet, das zwar veraltet ist, aber noch sehr günstig erhältlich ist. Allerdings funktioniert auch jedes andere ESP32 problemlos.

Ich habe zwei verschiedene Arten von Bewegungssensoren aufgelistet. Wenn du eine kleine Größe möchtest, nimm den AM312. Wenn du Bewegung nur nachts erkennen willst, nimm den HC-SR501, da dieser leicht mit einem Lichtsensor ausgestattet werden kann und eine größere Erkennungsreichweite hat.

ESP32 lite Lolin32

ESP32 lite

USB data cable

USB-Datenkabel

Dupont wire set

Dupont-Kabelset

Half_breadboard56a

Breadboard

Bewegungssensor

HC-SR501 PIR-Bewegungssensor

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Telegram Messenger

Telegram Messenger ist eine cloudbasierte Messaging-App. Du kannst sie einfach auf deinem Smartphone (Android und iPhone) oder Computer (PC, Mac und Linux) installieren. Sie ist komplett kostenlos und hat keine nervigen Werbeanzeigen.

Du kannst Nachrichten, Fotos, Videos, Sprachnachrichten, Dateien senden und Sprach- oder Videoanrufe tätigen. Ein besonderes Merkmal ist das Cloud-Speichersystem, mit dem du deine Chats nahtlos auf mehreren Geräten abrufen kannst. Telegram unterstützt außerdem große Gruppenchats, öffentliche Broadcast-Kanäle und Bots, was es sowohl für private als auch für Community-Kommunikation beliebt macht.

Im Vergleich zu WhatsApp oder Signal, Telegram ist allgemein flexibler und entwicklerfreundlicher. WhatsApp ist standardmäßig Ende-zu-Ende-verschlüsselt und weit verbreitet, bietet aber nur begrenzte Bot-Unterstützung und weniger Automatisierungsoptionen. Signal ist in Sachen Datenschutz am sichersten, hat aber nicht die APIs und Bot-Systeme, die Telegram für die Hardware-Integration geeignet machen. Für den Empfang von Nachrichten vom ESP32 ist Telegram die einfachste Plattform, da es eine gut dokumentierte Bot-API gibt, mit der der ESP32 Nachrichten per HTTPS mit minimalem Aufwand senden kann.

Telegram installieren

Die Installation von Telegram ist einfach. Gehe einfach in deinen Google Play oder App Store und lade die Telegram App herunter und installiere sie. Du kannst sie auch als Desktop-Anwendung auf Windows installieren.

Telegram App on Google Play Store
Telegram App im Google Play Store

Telegram Bot erstellen

Um Nachrichten vom ESP32 auf deiner Telegram-App zu empfangen, müssen wir zuerst einen Bot erstellen. Bots sind Drittanbieter-Anwendungen, die innerhalb von Telegram laufen. Nutzer können mit Bots interagieren, indem sie ihnen Nachrichten, Befehle und Inline-Anfragen senden.

Wir verwenden den BotFather-Bot, um einen neuen Bot zu erstellen, der unsere Nachrichten empfängt. Öffne Telegram auf deinem Handy und suche nach „botfather“. Klicke dann auf den BotFather-Bot wie unten gezeigt oder öffne den Link t.me/botfather.

Install BotFather Bot
BotFather Bot installieren (source)

Achte darauf, den richtigen Bot auszuwählen. Es gibt ähnlich benannte Bots, die du vermeiden solltest. Suche nach diesem Bild, um sicherzugehen, oder nutze den bereitgestellten link:

BotFather Application Image
BotFather Anwendungsbild (source)

Wenn du den BotFather Bot auswählst und anklickst, sollte folgende Nachricht erscheinen. Drücke den /start Button (rot markiert):

Start BotFather Bot
BotFather Bot starten (source)

Gib als Nächstes /newbot ein und folge den Anweisungen, um deinen Bot zu erstellen. Du musst einen Namen angeben, z.B. „My_ESP32_receiver“ und einen Benutzernamen, der auf ‚bot‘ enden muss, z.B. „My_ESP32_receiver_bot“.

Create new Bot with BotFather
Neuen Bot mit BotFather erstellen (source)

Viele Namen sind bereits vergeben, du wirst wahrscheinlich mehrere Versuche brauchen, bis du einen verfügbaren Namen findest. Sobald dein Bot erstellt ist, siehst du eine Nachricht mit einem Link zum Zugriff auf den Bot und dem bot token.

Das bot token ist eine Zeichenkette, die so aussieht: 1234567811:fakeIodw9023sjjoj982qe23dSSDCDDDSSxx, aber für deinen Bot anders sein wird. Speichere das Bot-Token gut – wir brauchen es später. Am besten kopierst du es auf dein Handy und schickst es dir per E-Mail zu.

Get bot token
Bot-Token erhalten (source)

Telegram User ID erhalten

Als Nächstes brauchen wir unsere Telegram User ID, wofür wir einen weiteren Bot verwenden. Öffne Telegram und suche nach „IDBot“ oder öffne diesen Link t.me/myidbot:

Call IDBot
IDBot aufrufen (source)

Du erhältst eine Nachricht, die erklärt, was dieser Bot macht. Antworte auf diese Nachricht mit /getid. Du bekommst eine Antwort mit deiner User ID, z.B. ‚7221435846‘. Speichere die User ID gut, da wir sie später brauchen.

Get User ID via IDBot
User ID via IDBot erhalten (source)

Jetzt haben wir alle nötigen Informationen. Im nächsten Abschnitt schreiben wir den Code, der eine Nachricht vom ESP32 an deinen Bot sendet.

Code zum Senden von Telegram-Nachrichten

Wir verwenden die UniversalTelegramBot Library, um Telegram-Nachrichten einfach vom ESP32 zu senden. Um diese Bibliothek zu installieren, öffne den LIBRARY MANAGER der Arduino IDE, suche nach ‚UniversalTelegramBot‘ und klicke dann auf INSTALL. Nach erfolgreicher Installation solltest du die Bibliothek sehen:

Einfache Nachricht senden

Im ersten Codebeispiel senden wir eine einfache, feste Nachricht als Test an unseren Telegram-Bot. Unten ist der komplette Code. Schau ihn dir kurz an, dann besprechen wir die Details.

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";

WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

void setup() {
  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);

  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
  bot.sendMessage(CHAT_ID, "Message-1", "");
}

void loop() {}

Der Code beginnt mit dem Einbinden der benötigten Bibliotheken für WiFi und Telegram-Kommunikation:

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

Als Nächstes definieren wir die Konstanten SSID und PASSWORD für die WiFi-Authentifizierung sowie die Konstanten BOT_TOKEN und CHAT_ID für die Telegram-App. Für CHAT_ID musst du die User ID verwenden, die du vom IDBot erhalten hast, und für BOT_TOKEN das Token, das du vom BotFather Bot bekommen hast.

const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";

Mit den definierten Konstanten erstellen wir dann die Objekte für WiFi- und Telegram-Kommunikation:

WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

Schließlich implementieren wir die setup Funktion, in der wir zuerst die WiFi-Verbindung herstellen. Dann setzen wir das Zertifikat für eine sichere Telegram-Kommunikation und senden die Nachricht ‚Message-1‘ durch Aufruf von bot.sendMessage():

void setup() {
  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);

  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
  bot.sendMessage(CHAT_ID, "Message-1", "");
}

Mit diesem Code wird bei jedem Reset deines ESP32 dieselbe Nachricht ‚Message-1‘ an deinen Telegram-Bot gesendet.

Die loop Funktion bleibt leer. Hier könntest du Nachrichten wiederholt senden, aber achte darauf, eine Verzögerung einzubauen, sonst wird dein Telegram-Bot mit Nachrichten überflutet!

Nachricht mit Zeitstempel senden

Oft möchte man, dass die Nachricht mit einem Zeitstempel versehen ist, damit man weiß, wann sie gesendet wurde. Der folgende Code ist eine kleine Erweiterung des vorherigen Codes, die einen Zeitstempel zur Nachricht hinzufügt:

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <time.h>

const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";

WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

void sendMessage() {
  struct tm t;
  if (getLocalTime(&t)) {
    char msg[64];
    strftime(msg, sizeof(msg), "Message@%H:%M:%S", &t);
    bot.sendMessage(CHAT_ID, msg, "");
  }
}

void setup() {
  configTime(0, 0, "pool.ntp.org");  // UTC
  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);

  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);

  sendMessage();
}

void loop() { }

Die Hauptunterschiede sind die sendMessage() Funktion und der Setup-Teil. Die sendMessage() Funktion holt die lokale Zeit, formatiert einen String mit Zeitstempel und sendet die Nachricht:

void sendMessage() {
  struct tm t;
  if (getLocalTime(&t)) {
    char msg[64];
    strftime(msg, sizeof(msg), "Message@%H:%M:%S", &t);
    bot.sendMessage(CHAT_ID, msg, "");
  }
}

Die Nachricht sieht dann z.B. so aus: ‚Message@12:31:00‘. Du kannst den Nachrichtentext oder das Zeitformat nach Belieben anpassen. Schau dir die Dokumentation zur strftime Funktion an.

Im setup Teil konfigurieren wir zuerst die Uhr des ESP32, um die Zeit von einem Internet-Zeitdienst zu beziehen, indem wir configTime() aufrufen. In diesem Beispiel ist die Uhr auf UTC eingestellt, du kannst aber deine eigene Zeitzone setzen.

void setup() {
  configTime(0, 0, "pool.ntp.org");  // UTC
  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);

  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);

  sendMessage();
}

Wenn du mehr über Uhrensynchronisation und Zeitstring-Formate lernen möchtest, schau dir die How to synchronize ESP32 clock with SNTP server und vielleicht die Digital Clock on e-Paper Display Tutorials an.

Als Nächstes setzen wir das Zertifikat für die sichere Telegram-Kommunikation und stellen die WiFi-Verbindung her. Schließlich senden wir die Nachricht durch Aufruf von sendMessage().

Mit diesem Code erhältst du bei jedem Reset deines ESP32 eine neue, mit Zeitstempel versehene Nachricht.

Bewegungsalarm-Nachricht senden

Im letzten Codebeispiel senden wir eine Alarmnachricht an unseren Telegram-Bot, wenn unser ESP32 eine Bewegung erkennt. Dafür müssen wir einen Bewegungssensor an den ESP32 anschließen. Das folgende Bild zeigt, wie du den AM312 PIR-Sensor an den ESP32 lite anschließt:

AM312 mit ESP32 verbinden

Beginne damit, den Minus-Pin (-) des AM312 mit dem Ground-Pin (G) des ESP32 zu verbinden und den Plus-Pin (+) mit dem 3V-Pin. Ich habe den Signal-Pin (s) des AM312 an Pin 17 angeschlossen, du kannst aber auch fast jeden anderen Pin verwenden. Achte nur darauf, den Code unten entsprechend anzupassen.

Wenn du mehr über Bewegungserkennung lernen möchtest, schau dir unsere How to Build a Motion Activated Night Light und die How to use HC-SR501 PIR Motion Sensor with Arduino Tutorials an.

Der folgende Code sendet eine mit Zeitstempel versehene Alarmnachricht, wenn der PIR-Sensor am ESP32 eine Bewegung erkennt, und wartet dann eine Stunde, bevor der nächste Alarm ausgelöst werden kann:

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <time.h>

const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";
const int PIR_PIN = 17;
const int WAIT_TIME = 60 * 60 * 1000; // wait one hour

WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

void sendMessage() {
  struct tm t;
  if (getLocalTime(&t)) {
    char msg[128];
    strftime(msg, sizeof(msg), "Alert @ %Y-%m-%d %H:%M:%S", &t);
    bot.sendMessage(CHAT_ID, msg, "");
  }
}

void setup() {
  pinMode(PIR_PIN, INPUT);
  configTime(0, 0, "pool.ntp.org");  // UTC
  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);

  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);
}

void loop() {
  if (digitalRead(PIR_PIN) == HIGH) {
    sendMessage();
    delay(WAIT_TIME);
  }
}

Der Code ist den vorherigen Beispielen sehr ähnlich. Der einzige wirkliche Unterschied ist in der loop Funktion, wo wir jetzt prüfen, ob der PIR-Sensor eine Bewegung erkannt hat. Falls ja, senden wir die Alarmnachricht und warten dann die Zeit in WAIT_TIME, um häufiges Auslösen zu vermeiden.

Du kannst die PIR_PIN Konstante ändern, um den Sensor an einem anderen Pin anzuschließen, und die WAIT_TIME Konstante, um die minimale Wartezeit zwischen den Alarmen zu ändern. Mach die WAIT_TIME aber nicht zu klein, sonst wird dein Handy mit Nachrichten überschwemmt.

Fazit

In diesem Artikel hast du gelernt, wie du eine Nachricht von einem ESP32 an die Telegram App auf deinem Handy sendest.

Wir haben außerdem einen PIR-Sensor an den ESP32 angeschlossen, um Alarmnachrichten bei Bewegungserkennung zu senden. Du könntest diese Funktion mit einem Kamerasystem kombinieren, um benachrichtigt zu werden, wenn du den Überwachungs-Stream oder Aufnahmen prüfen solltest. Siehe die Surveillance Camera with ESP32-CAM, Take Photos with ESP32-CAM und die Motion Activated ESP32-CAM Tutorials, wie man so ein System baut.

Wenn du nicht nur Benachrichtigungen erhalten, sondern den ESP32 z.B. zum Einschalten von Lichtern per Telegram-Nachrichten steuern möchtest, schau dir das Control ESP32 from Telegram Tutorial an.

Wenn du Fragen hast, kannst du sie gerne im Kommentarbereich stellen.

Viel Spaß beim Tüfteln ; )