Ratgeber · 13 Min. Lesezeit

ESP32 Telegram Bot: Benachrichtigungen, LED und Relais steuern

ESP32 Telegram Bot bauen: Token mit BotFather, Chat-ID, UniversalTelegramBot einrichten, Bewegungs- und Gasalarm, Relais per Befehl und nur deine ID erlaubt.

Ein ESP32 Telegram Bot sorgt dafür, dass der ESP32 bei dir zu Hause Nachrichten an dein Handy schickt und deine Befehle ausführt. Bewegt sich etwas an der Tür oder riecht es in der Küche nach Gas, landet sofort eine Benachrichtigung in deiner Hosentasche; schreibst du "/ac", schaltet ein Relais die Lampe ein, mit "/kapat" wieder aus. Dafür musst du weder eine eigene App programmieren noch einen Port im Router freigeben oder einen kostenpflichtigen Cloud-Dienst buchen: Die kostenlose Bot API von Telegram und das eingebaute WLAN des ESP32 reichen völlig.

In dieser Anleitung baust du ein funktionierendes System von Grund auf: Du legst mit dem BotFather einen Bot an und erhältst seinen Token, findest deine eigene Chat-ID, installierst die Bibliotheken UniversalTelegramBot und ArduinoJson und schickst die erste Nachricht vom ESP32. Danach kommen Bewegungs- und Gasalarme mit einem PIR-Sensor und einem MQ-2-Gassensor sowie die Steuerung von LED und Relais per Telegram-Befehl dazu. Außerdem gehen wir durch, wie der Bot nur auf deine ID antwortet, wie die Zertifikatseinstellung funktioniert, was beim ESP8266 und beim Raspberry Pi Pico W anders ist und welche Fehler am häufigsten auftreten.

ESP32-Entwicklungsboard als Telegram-Bot
Dank seines eingebauten WLANs verbindet sich der ESP32 direkt mit dem Telegram-Server; ein Zusatzmodul oder Gateway ist nicht nötig.

Was ist ein ESP32 Telegram Bot und wie funktioniert er?

Ein Bot ist bei Telegram ein besonderes Konto, das statt eines Menschen von einem Programm gesteuert wird; in unserem Projekt läuft dieses Programm auf dem ESP32. ESP32 und Handy verbinden sich nie direkt miteinander, beide sprechen mit dem Telegram-Server. Schreibst du dem Bot auf dem Handy "/ac", wartet die Nachricht auf dem Server. Der ESP32 schickt jede Sekunde eine verschlüsselte HTTPS-Anfrage (getUpdates) an api.telegram.org und fragt "Gibt es neue Nachrichten für mich?", holt die Nachricht ab und führt sie aus. Für eine Benachrichtigung stellt er in umgekehrter Richtung eine sendMessage-Anfrage. Weil immer der ESP32 die Verbindung aufbaut, brauchst du weder Portweiterleitung noch eine feste IP; das Board funktioniert in jedem 2,4-GHz-WLAN mit Internetzugang.

BegriffWofür?Beispiel
BotFatherDer Telegram-Bot zum Anlegen und Verwalten von Bots/newbot, /setcommands, /revoke
Bot-TokenDas Passwort des Bots; damit meldet sich dein Code bei Telegram an1234567890:AAE... (Zahl, Doppelpunkt, lange Zeichenkette)
Chat-IDDie Nummer der Person oder Gruppe, an die eine Nachricht gehtPerson: 123456789, Gruppe: -1001234567890
getUpdatesHolt neue Nachrichten an den Bot vom Serverbot.getUpdates(...)
sendMessageSchickt eine Nachricht an die angegebene Chat-IDbot.sendMessage(CHAT_ID, "Hallo")
BefehlKurze Nachricht mit / am Anfang, die der Bot versteht/ac, /kapat, /durum

Warum Telegram? Vergleich mit anderen Benachrichtigungswegen

MethodeVorteileNachteileAm besten für
Telegram-BotKostenlos, sofortige Meldungen, Befehle in beide Richtungen, keine PortfreigabeKeine Diagramme, kein fertiges DashboardAlarme und einfache Fernsteuerung
Blynk IoTFertige Schalter, Anzeigen und DiagrammeNachrichten- und Gerätelimits im Gratis-TarifDashboards zur Sensorüberwachung
E-Mail (SMTP)Funktioniert auf jedem Handy, auch lange BerichteVerzögert, Befehle empfangen ist umständlichTägliche Berichte
SMS (SIM800L)Kein WLAN und kein Internet nötigSIM-Karte und SMS-Kosten, ZusatzmodulGartenhaus oder Lager ohne Internet
ESP32-WebserverKomplett lokal und kostenlosMeist nur im selben Netz erreichbar, keine BenachrichtigungenSteuerpanel im Haus

Kurz gesagt: Für Projekte nach dem Muster "Sag mir Bescheid, wenn etwas passiert, und tu das, wenn ich einen Befehl schicke" ist Telegram der einfachste und günstigste Weg. Willst du Sensordaten als Diagramm verfolgen, passt die Blynk-ESP32-Anleitung besser; brauchst du Meldungen von einem Ort ohne WLAN, sieh dir den Beitrag zum SIM800L GSM-Modul an.

Schritt 1: Bot mit BotFather anlegen und Token erhalten

  1. Öffne Telegram auf dem Handy oder Computer, gib BotFather ins Suchfeld ein und wähle das offizielle Konto mit dem blauen Haken neben dem Namen. Achte auf gefälschte Konten mit ähnlichem Namen.
  2. Tippe auf Starten (Start) und sende den Befehl /newbot.
  3. BotFather fragt zuerst nach dem Anzeigenamen des Bots; gib einen beliebigen Namen ein, zum Beispiel "Hausalarm".
  4. Danach will er einen Benutzernamen. Der muss eindeutig sein, darf nur lateinische Buchstaben, Ziffern und Unterstriche enthalten und muss auf bot enden, zum Beispiel mein_hausalarm_bot. Ist er vergeben, häng eine Zahl an und versuch es erneut.
  5. BotFather antwortet mit "Done! Congratulations on your new bot." und schickt dir den Link zu deinem Bot und den Token. Der Token sieht so aus: 1234567890:AAE..., also eine Zahl, ein Doppelpunkt und eine lange Zeichenkette. Kopiere ihn vollständig und bewahre ihn sicher auf.
  6. Öffne über den Link von BotFather deinen Bot und tippe auf Starten. Dieser Schritt ist Pflicht: Bei Telegram dürfen Bots einem Nutzer nicht von sich aus die erste Nachricht schreiben, das Gespräch musst immer du beginnen.
Der Token ist der Schlüssel zu deinem Bot: Wer ihn hat, kann die Nachrichten an deinen Bot lesen, in seinem Namen schreiben und die Befehle für deinen ESP32 vor ihm abholen. Teile Code mit dem Token niemals in Foren, auf Screenshots oder in einem öffentlichen GitHub-Repository. Glaubst du, er ist durchgesickert, widerrufst du ihn bei BotFather mit /revoke, holst dir einen neuen Token und lädst deinen Code erneut hoch.

Schritt 2: Wie findest du deine Telegram Chat-ID?

Der Bot-Token beantwortet die Frage "welcher Bot?", die Chat-ID die Frage "wer bekommt die Nachricht?". Jeder Telegram-Nutzer, jede Gruppe und jeder Kanal hat eine feste Zahlen-ID, die nichts mit deinem Benutzernamen mit @ zu tun hat. Es gibt drei einfache Wege, deine eigene Chat-ID herauszufinden:

  1. Mit einem ID-Bot: Such dir in Telegram einen ID-Bot wie @userinfobot und tippe auf Starten; er schickt dir deine Nummer in der Zeile Id. Diese Bots gehören nicht dir, sie zeigen nur deine ID an.
  2. Mit dem Browser: Schreib zuerst irgendeine Nachricht an deinen eigenen Bot. Öffne dann im Browser am Computer api.telegram.org/botTOKEN/getUpdates (ersetze TOKEN durch deinen Token, das Wort "bot" davor bleibt stehen). Im angezeigten Text ist die Zahl bei "chat":{"id":123456789 deine Chat-ID. Zeigt die Seite eine leere result-Liste, schreib dem Bot noch einmal und lade die Seite neu.
  3. Mit dem ESP32: Sobald du den Befehls-Code unten hochlädst, wird die ID jedes nicht berechtigten Absenders mit der Zeile "unauthorized ID" im seriellen Monitor ausgegeben. Willst du ein Familienmitglied hinzufügen, lass es dem Bot schreiben und lies die Nummer dort ab.
Willst du den Bot in einer Familiengruppe nutzen, füge ihn der Gruppe hinzu, schreib dort eine Nachricht und schau dir die getUpdates-Seite erneut an: Gruppen-IDs beginnen mit einem Minuszeichen, bei Supergruppen mit -100. Ein vergessenes Minus ist die häufigste Ursache für den Fehler "chat not found". Im standardmäßigen Privatsphäre-Modus liest der Bot den Gruppenchat nicht mit, sondern sieht nur Befehle mit / am Anfang, die an ihn gerichtet sind; für einen Befehls-Bot reicht das.

Schritt 3: UniversalTelegramBot und ArduinoJson installieren

  1. Ist das ESP32-Boardpaket in der Arduino IDE noch nicht installiert, erledige das zuerst; die Schritte stehen im Beitrag Was ist der ESP32?.
  2. Öffne Werkzeuge > Bibliotheken verwalten, gib UniversalTelegramBot ins Suchfeld ein und installiere die Bibliothek von Brian Lough. Die Codes in dieser Anleitung wurden mit UniversalTelegramBot 1.3.0, ArduinoJson 7 und dem ESP32-Boardpaket 2.0.11 kompiliert.
  3. Fragt der Installer nach Abhängigkeiten, wähle Install all; fragt er nicht, suche im selben Fenster nach ArduinoJson und installiere die Bibliothek von Benoit Blanchon separat.
  4. Unter Datei > Beispiele > UniversalTelegramBot > ESP32 findest du fertige Beispiele wie FlashLED; die Codes in dieser Anleitung sind vereinfachte Fassungen davon, ergänzt um Sicherheitsfunktionen.

UniversalTelegramBot ist im Stil von ArduinoJson Version 6 geschrieben, lässt sich aber auch mit ArduinoJson 7 problemlos kompilieren. Hast du in der Arduino IDE die Compiler-Warnungen eingeschaltet, siehst du Zeilen wie "'DynamicJsonDocument' is deprecated: use JsonDocument instead"; das sind Warnungen, keine Fehler, und das Programm läuft normal. Hast du Probleme beim Installieren von Bibliotheken, hilft dir die Anleitung Arduino-Bibliothek hinzufügen.

Material und Verdrahtung

Für das komplette Projekt brauchst du ein ESP32-Entwicklungsboard, einen PIR-Bewegungssensor HC-SR501, ein MQ-2-Gassensormodul, ein 5-V-Relaismodul, je einen Widerstand mit 10 kΩ und 20 kΩ, ein Breadboard und Jumperkabel. Als LED nutzen wir die eingebaute blaue LED des ESP32 an GPIO 2. Für die ersten beiden Schritte reichen ESP32 und USB-Kabel; die Sensoren kannst du später ergänzen.

ESP32
ESP32
PIR HC-SR501
PIR HC-SR501
MQ-2
MQ-2
Relaismodul
Relaismodul
VerbindungESP32ESP8266 (NodeMCU)Raspberry Pi Pico W
PIR VCCVIN (5V)VIN (5V)VBUS (5V)
PIR OUTGPIO 27D5 (GPIO 14)GP16
MQ-2 VCCVIN (5V)VIN (5V)VBUS (5V)
MQ-2 AO (über 10-kΩ/20-kΩ-Teiler)GPIO 34A0GP26 (ADC0)
Relais VCCVIN (5V)VIN (5V)VBUS (5V)
Relais INGPIO 26D1 (GPIO 5)GP15
LEDGPIO 2 (eingebaut)D4 (eingebaut, leuchtet bei LOW)"LED" (eingebaut)
Alle GNDsGNDGNDGND
Die Pins von ESP32, ESP8266 und Pico arbeiten mit 3,3 V. Wird das MQ-2-Modul mit 5 V versorgt, kann sein AO-Ausgang bis auf 5 V steigen. Baue deshalb einen Spannungsteiler: AO über 10 kΩ an den Analog-Pin, den Analog-Pin über 20 kΩ an GND. So werden aus 5 V etwa 3,3 V. Schaltest du mit dem Relais eine 230-V-Netzlast, verdrahte nur bei gezogenem Stecker und hol dir Hilfe von einem Erwachsenen; Details im Beitrag Was ist ein Relaismodul?.

Achte auch auf die Stromversorgung: Allein die Heizung des MQ-2 zieht etwa 150 mA, die Relaisspule um die 70 mA, und der ESP32 kann beim Senden über WLAN kurzzeitig bis zu 250 mA ziehen. Ein USB-Port am Computer schafft diese Summe nicht immer, und das Board startet dann ausgerechnet beim Senden einer Nachricht neu. Nimm ein 5-V-Netzteil mit mindestens 1 A und ein gutes Kabel; hält das Problem an, lies ESP32 Brownout und Guru Meditation. Alle Pins deines Boards siehst du im Werkzeug Pinout.

Erster Test: eine Nachricht vom ESP32 an Telegram senden

Bevor es mit den Sensoren losgeht, prüfen wir Token und Chat-ID mit dem einfachsten Sketch. Ersetze im Code unten WLAN-Name, Passwort sowie die Zeilen BOT_TOKEN und CHAT_ID durch deine eigenen Daten und lade ihn aufs Board. Öffne danach den seriellen Monitor mit 115200 Baud:

C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi";          // Wi-Fi adın (yalnız 2,4 GHz) / your Wi-Fi name (2.4 GHz only)
7const char* WIFI_PASS = "Sifre123";       // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"   // BotFather'ın verdiği token / token from BotFather
9#define CHAT_ID   "123456789"             // kendi Telegram ID'n / your own Telegram ID
10
11WiFiClientSecure client;                  // şifreli (HTTPS) bağlantı / encrypted (HTTPS) connection
12UniversalTelegramBot bot(BOT_TOKEN, client);
13
14void setup() {
15  Serial.begin(115200);
16  WiFi.mode(WIFI_STA);
17  WiFi.begin(WIFI_SSID, WIFI_PASS);
18  Serial.print("Wi-Fi'ye baglaniyor / connecting to Wi-Fi");
19  while (WiFi.status() != WL_CONNECTED) {
20    delay(500);
21    Serial.print(".");
22  }
23  Serial.println();
24  Serial.println(WiFi.localIP());
25
26  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);   // api.telegram.org kök sertifikası / root certificate of api.telegram.org
27
28  if (bot.sendMessage(CHAT_ID, "Merhaba! ESP32 çevrimiçi / Hello! ESP32 is online")) {
29    Serial.println("Mesaj gonderildi / message sent");
30  } else {
31    Serial.println("Mesaj gonderilemedi / message failed");
32  }
33}
34
35void loop() {
36}

Nach wenigen Sekunden sollte dir dein Bot auf Telegram "Hello! ESP32 is online" schicken, und im seriellen Monitor sollte "Mesaj gonderildi / message sent" stehen. sendMessage() gibt true zurück, wenn die Nachricht zugestellt wurde; siehst du "message failed", liegt das Problem bei der WLAN-Verbindung, beim Token, bei der Chat-ID oder bei der Zertifikatseinstellung. Bevor du den Code verdächtigst, öffne im Browser api.telegram.org/botTOKEN/getMe: Mit gültigem Token erscheinen "ok":true und der Name deines Bots, mit falschem Token "Unauthorized".

Zertifikatseinstellung: setCACert oder setInsecure?

Telegram akzeptiert nur HTTPS, deshalb nutzt der Code WiFiClientSecure statt eines einfachen WiFiClient. Bei einer verschlüsselten Verbindung muss der ESP32 sicherstellen, dass er wirklich mit api.telegram.org spricht; dazu prüft er das Serverzertifikat gegen das Stammzertifikat an der Spitze der Kette. UniversalTelegramBot bringt dieses Stammzertifikat als TELEGRAM_CERTIFICATE_ROOT fertig mit. Die Zertifikatskette von Telegram endet bei Go Daddy Root Certificate Authority - G2, das bis Ende 2037 gültig ist; wechselt Telegram irgendwann den Zertifikatsanbieter, muss auch die Bibliothek aktualisiert werden.

EinstellungWas sie tutSicherheitWann verwenden?
client.setCACert(TELEGRAM_CERTIFICATE_ROOT)Verschlüsselt die Verbindung und prüft die Identität des ServersHochImmer die empfohlene Einstellung
client.setInsecure()Verschlüsselt die Verbindung, prüft aber nicht, wer der Server istMittel: bemerkt keinen gefälschten Server dazwischenKurzer Test, um Zertifikatsprobleme auszuschließen
Keine von beidenMit aktuellen ESP32-Cores kommt gar keine Verbindung zustandeFunktioniert nichtNie: Es geht keine Nachricht raus und im seriellen Monitor erscheint kein Fehler
ESP8266: setTrustAnchors(&cert)Das Gegenstück beim ESP8266; das Zertifikat wird als X509List übergebenHochNodeMCU und Wemos D1 Mini; braucht die richtige Uhrzeit

LED und Relais per Telegram-Befehl steuern (/ac, /kapat)

Jetzt machen wir den Bot zweiseitig. Der Code unten fragt Telegram einmal pro Sekunde nach neuen Nachrichten; lautet der Text /ac (türkisch für "an"), schaltet er Relais und LED ein, /kapat ("aus") schaltet sie aus, /durum ("Status") meldet den aktuellen Zustand und /start schickt die Befehlsliste. Du kannst die Befehle gern in /an und /aus umbenennen, beachte aber: Telegram-Befehle dürfen nur kleine lateinische Buchstaben, Ziffern und Unterstriche enthalten und höchstens 32 Zeichen lang sein. Ein Befehl mit Umlaut wie "/schließen" wird nicht als antippbarer Befehl erkannt.

C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi";
7const char* WIFI_PASS = "Sifre123";
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
9#define CHAT_ID   "123456789"                 // yalnız bu ID'ye yanıt verilir / only this ID gets answers
10
11const int LED_PIN  = 2;                       // çoğu DevKit'te dahili LED / onboard LED on most DevKits
12const int ROLE_PIN = 26;                      // röle modülünün IN pini / relay module IN pin
13const bool ROLE_AKTIF_LOW = true;             // çoğu modül LOW'da çeker / most modules switch on with LOW
14
15const unsigned long KONTROL_ARALIGI = 1000;   // Telegram'a saniyede bir sor / ask Telegram once per second
16unsigned long sonKontrol = 0;
17bool roleAcik = false;
18
19WiFiClientSecure client;
20UniversalTelegramBot bot(BOT_TOKEN, client);
21
22void roleYaz(bool acik) {
23  roleAcik = acik;
24  if (ROLE_AKTIF_LOW) digitalWrite(ROLE_PIN, acik ? LOW : HIGH);
25  else                digitalWrite(ROLE_PIN, acik ? HIGH : LOW);
26  digitalWrite(LED_PIN, acik ? HIGH : LOW);   // LED röle durumunu gösterir / LED mirrors the relay
27}
28
29void mesajlariIsle(int adet) {
30  for (int i = 0; i < adet; i++) {
31    String chatId = bot.messages[i].chat_id;
32    String metin  = bot.messages[i].text;
33
34    // Güvenlik: tanımadığın kişiye cevap verme / security: never answer strangers
35    if (chatId != CHAT_ID) {
36      Serial.println("Yetkisiz ID / unauthorized ID: " + chatId);
37      continue;
38    }
39
40    int at = metin.indexOf('@');              // gruptaki "/ac@bot_adi" -> "/ac" / "/ac@bot_name" in groups -> "/ac"
41    if (at > 0) metin = metin.substring(0, at);
42
43    if (metin == "/start") {
44      String yardim = "Merhaba " + bot.messages[i].from_name + "!\n";
45      yardim += "/ac - röleyi aç / relay ON\n";
46      yardim += "/kapat - röleyi kapat / relay OFF\n";
47      yardim += "/durum - son durum / status";
48      bot.sendMessage(chatId, yardim);
49    } else if (metin == "/ac") {
50      roleYaz(true);
51      bot.sendMessage(chatId, "Röle AÇIK / relay ON");
52    } else if (metin == "/kapat") {
53      roleYaz(false);
54      bot.sendMessage(chatId, "Röle KAPALI / relay OFF");
55    } else if (metin == "/durum") {
56      bot.sendMessage(chatId, roleAcik ? "Röle AÇIK / relay ON" : "Röle KAPALI / relay OFF");
57    } else {
58      bot.sendMessage(chatId, "Bilinmeyen komut, /start yaz / unknown command, send /start");
59    }
60  }
61}
62
63void setup() {
64  Serial.begin(115200);
65  pinMode(LED_PIN, OUTPUT);
66  pinMode(ROLE_PIN, OUTPUT);
67  roleYaz(false);                             // açılışta röle kapalı / relay off at boot
68
69  WiFi.mode(WIFI_STA);
70  WiFi.begin(WIFI_SSID, WIFI_PASS);
71  while (WiFi.status() != WL_CONNECTED) delay(500);
72  Serial.println(WiFi.localIP());
73
74  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
75  bot.sendMessage(CHAT_ID, "Bot hazır, /start yaz / bot ready, send /start");
76}
77
78void loop() {
79  if (millis() - sonKontrol > KONTROL_ARALIGI) {
80    int adet = bot.getUpdates(bot.last_message_received + 1);   // yeni mesaj var mı? / any new messages?
81    while (adet) {
82      mesajlariIsle(adet);
83      adet = bot.getUpdates(bot.last_message_received + 1);
84    }
85    sonKontrol = millis();
86  }
87}
ZeileAufgabe
bot.getUpdates(bot.last_message_received + 1)Fragt die Nachrichten nach der zuletzt verarbeiteten ab und gibt zurück, wie viele angekommen sind; das +1 verhindert, dass dieselbe Nachricht erneut kommt
bot.messages[i].chat_idDie ID des Chats, aus dem die Nachricht kam; die Antwort geht dorthin, und die Sicherheitsprüfung nutzt sie
bot.messages[i].textDer empfangene Text; damit vergleichen wir den Befehl
metin.indexOf('@')Schneidet den Teil @bot_name ab, den Telegram in Gruppen an Befehle anhängt
ROLE_AKTIF_LOWDie meisten Relaismodule schalten bei LOW; zieht deins bei HIGH an, setze den Wert auf false
KONTROL_ARALIGIWie oft nachgefragt wird; 1000 ms reagiert schnell, 3000–5000 ms belastet das Netz weniger

Sicherheit: Der Bot antwortet nur auf deine ID

Bot-Benutzernamen sind bei Telegram öffentlich und durchsuchbar. Errät jemand mein_hausalarm_bot oder entdeckt den Namen auf einem Screenshot und schickt /ac, führt ein ESP32 ohne Prüfung auch diesen Befehl aus. Deshalb ist die Prüfung chatId != CHAT_ID die wichtigste Zeile im Code. Deine Chat-ID muss nicht geheim sein; der Schutz entsteht dadurch, dass Telegram selbst bestätigt, wer eine Nachricht geschickt hat, und niemand die ID eines anderen fälschen kann. Fremden gar nicht zu antworten ist ebenfalls eine bewusste Entscheidung: Solange der Bot schweigt, merkt niemand, dass er überhaupt läuft.

  • Nutze eine Positivliste: Speichere die berechtigten IDs in einem Array, ignoriere alle anderen Nachrichten und füge Familienmitglieder einzeln hinzu.
  • Prüfe in Gruppen die Person: In einer Gruppe ist die Chat-ID die ID der Gruppe; sollen nur bestimmte Personen Befehle geben, vergleiche from_id statt chat_id.
  • Token in einer eigenen Datei: Leg Token und WLAN-Passwort in eine Datei wie secrets.h und lass sie weg, wenn du deinen Code teilst.
  • Alte Befehle überspringen: Ein /ac, das während eines Stromausfalls gesendet wurde, soll nicht in einem unerwarteten Moment beim Neustart ausgeführt werden; das Aufräumen beim Start im vollständigen Code verhindert das.
  • Sicherer Startzustand: Starte bei jedem Einschalten mit ausgeschaltetem Relais; bei Lasten wie Heizungen oder Pumpen ist das sehr wichtig.
  • Kritisches nicht allein dem Bot überlassen: Überleg bei Türschloss oder Heizkessel, was ein falscher Befehl anrichten kann, und ergänze eine Bestätigung oder ein Zeitlimit.

Bewegungs- und Gasalarm: komplettes Projekt mit Telegram-Benachrichtigung

Jetzt setzen wir alles zusammen. Der Code unten schickt dir eine Telegram-Nachricht mit Uhrzeit, wenn der PIR-Sensor Bewegung erkennt und wenn der Gaswert des MQ-2 die Schwelle überschreitet. Gleichzeitig hört er auf die Befehle /ac, /kapat, /alarm_ac, /alarm_kapat und /durum, blendet bei /start unten ein Tastenmenü zum Antippen ein und trägt die Befehle in die Menü-Schaltfläche von Telegram ein. Details zu den Sensoren findest du in den Beiträgen PIR-Bewegungsmelder und MQ-2-Gassensor.

C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5#include <time.h>
6
7const char* WIFI_SSID = "AgAdi";
8const char* WIFI_PASS = "Sifre123";
9#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
10#define CHAT_ID   "123456789"                  // bildirimlerin gideceği ID / the ID that receives alerts
11
12// Komut verebilecek kişiler; aile üyesi eklemek için: { CHAT_ID, "222222222" }
13// People allowed to send commands; to add a family member: { CHAT_ID, "222222222" }
14const char* YETKILI[] = { CHAT_ID };
15const int YETKILI_SAYISI = sizeof(YETKILI) / sizeof(YETKILI[0]);
16
17const int LED_PIN  = 2;                        // dahili LED / onboard LED
18const int ROLE_PIN = 26;                       // röle modülü IN / relay module IN
19const int PIR_PIN  = 27;                       // PIR sensörü OUT / PIR sensor OUT
20const int GAZ_PIN  = 34;                       // MQ-2 AO, gerilim bölücü üzerinden / MQ-2 AO through a voltage divider
21const bool ROLE_AKTIF_LOW = true;              // çoğu modül LOW'da çeker / most modules switch on with LOW
22
23const int GAZ_ESIK = 1800;                     // temiz havadaki değere göre ayarla / tune it from your clean-air reading
24const int GAZ_FARK = 200;                      // histerezis payı / hysteresis margin
25const unsigned long HAREKET_BEKLEME = 60000;   // iki hareket bildirimi arası en az 60 sn / at least 60 s between motion alerts
26const unsigned long GAZ_ISINMA = 120000;       // MQ-2 ilk 2 dakika ısınır / MQ-2 warms up for the first 2 minutes
27const unsigned long KONTROL_ARALIGI = 1000;    // Telegram'a saniyede bir sor / poll Telegram once per second
28
29WiFiClientSecure client;
30UniversalTelegramBot bot(BOT_TOKEN, client);
31
32bool alarmKurulu = true;                       // hareket alarmı açık mı / is the motion alarm armed
33bool roleAcik = false;
34bool gazVar = false;
35unsigned long sonKontrol = 0;
36unsigned long sonHareket = 0;
37
38String saat() {                                // "14:05:31" biçiminde saat / time as "14:05:31"
39  struct tm t;
40  if (!getLocalTime(&t, 100)) return "--:--:--";
41  char buf[9];
42  strftime(buf, sizeof(buf), "%H:%M:%S", &t);
43  return String(buf);
44}
45
46bool yetkiliMi(const String& id) {
47  for (int i = 0; i < YETKILI_SAYISI; i++) {
48    if (id == YETKILI[i]) return true;
49  }
50  return false;
51}
52
53void roleYaz(bool acik) {
54  roleAcik = acik;
55  if (ROLE_AKTIF_LOW) digitalWrite(ROLE_PIN, acik ? LOW : HIGH);
56  else                digitalWrite(ROLE_PIN, acik ? HIGH : LOW);
57}
58
59String durumMetni() {
60  String s = "Röle / relay: ";
61  s += roleAcik ? "AÇIK / ON" : "KAPALI / OFF";
62  s += "\nAlarm: ";
63  s += alarmKurulu ? "KURULU / ARMED" : "KAPALI / DISARMED";
64  s += "\nGaz / gas: " + String(analogRead(GAZ_PIN));
65  s += "\nWi-Fi: " + String(WiFi.RSSI()) + " dBm";
66  return s;
67}
68
69void mesajlariIsle(int adet) {
70  for (int i = 0; i < adet; i++) {
71    String chatId = bot.messages[i].chat_id;
72    String metin  = bot.messages[i].text;
73
74    if (!yetkiliMi(chatId)) {                  // yabancıya sessiz kal / stay silent to strangers
75      Serial.println("Yetkisiz ID / unauthorized ID: " + chatId);
76      continue;
77    }
78    int at = metin.indexOf('@');               // "/ac@bot_adi" -> "/ac"
79    if (at > 0) metin = metin.substring(0, at);
80
81    if (metin == "/ac") {
82      roleYaz(true);
83      bot.sendMessage(chatId, "Röle AÇIK / relay ON");
84    } else if (metin == "/kapat") {
85      roleYaz(false);
86      bot.sendMessage(chatId, "Röle KAPALI / relay OFF");
87    } else if (metin == "/alarm_ac") {
88      alarmKurulu = true;
89      bot.sendMessage(chatId, "Hareket alarmı kuruldu / motion alarm armed");
90    } else if (metin == "/alarm_kapat") {
91      alarmKurulu = false;
92      bot.sendMessage(chatId, "Hareket alarmı kapatıldı / motion alarm disarmed");
93    } else if (metin == "/durum") {
94      bot.sendMessage(chatId, durumMetni());
95    } else {                                   // /start ve diğer her şey: tuş menüsü / /start and anything else: button menu
96      String klavye = "[[\"/ac\",\"/kapat\"],[\"/alarm_ac\",\"/alarm_kapat\"],[\"/durum\"]]";
97      bot.sendMessageWithReplyKeyboard(chatId, "Komut seç / choose a command", "", klavye, true);
98    }
99  }
100}
101
102void setup() {
103  Serial.begin(115200);
104  pinMode(LED_PIN, OUTPUT);
105  pinMode(ROLE_PIN, OUTPUT);
106  pinMode(PIR_PIN, INPUT);
107  roleYaz(false);                              // açılışta röle kapalı / relay off at boot
108
109  WiFi.mode(WIFI_STA);
110  WiFi.begin(WIFI_SSID, WIFI_PASS);
111  while (WiFi.status() != WL_CONNECTED) {
112    delay(500);
113    Serial.print(".");
114  }
115  Serial.println(WiFi.localIP());
116
117  client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // api.telegram.org kök sertifikası / root certificate of api.telegram.org
118  bot.maxMessageLength = 4000;                 // büyük mesajlarda takılmayı önler / prevents hanging on big messages
119  configTime(3 * 3600, 0, "pool.ntp.org");     // Türkiye UTC+3; kendi saat dilimini yaz / Turkey is UTC+3, set your own zone
120
121  // Telegram'daki Menü düğmesi; komutlar küçük harf, Türkçe karakter yok
122  // The Menu button in Telegram; commands are lowercase with no special letters
123  bot.setMyCommands("[{\"command\":\"ac\",\"description\":\"Röleyi aç\"},"
124                    "{\"command\":\"kapat\",\"description\":\"Röleyi kapat\"},"
125                    "{\"command\":\"alarm_ac\",\"description\":\"Hareket alarmını kur\"},"
126                    "{\"command\":\"alarm_kapat\",\"description\":\"Hareket alarmını kapat\"},"
127                    "{\"command\":\"durum\",\"description\":\"Durumu göster\"}]");
128
129  // Kart kapalıyken gelen eski komutları atla / skip old commands sent while the board was off
130  while (bot.getUpdates(bot.last_message_received + 1)) { }
131
132  bot.sendMessage(CHAT_ID, "Sistem açıldı / system started " + saat());
133}
134
135void loop() {
136  unsigned long simdi = millis();
137
138  // 1) Hareket alarmı / motion alarm
139  if (alarmKurulu && digitalRead(PIR_PIN) == HIGH && simdi - sonHareket > HAREKET_BEKLEME) {
140    sonHareket = simdi;
141    digitalWrite(LED_PIN, HIGH);
142    bot.sendMessage(CHAT_ID, "Hareket algılandı! / motion detected! " + saat());
143    digitalWrite(LED_PIN, LOW);
144  }
145
146  // 2) Gaz alarmı: ısınmadan sonra, susturulamaz / gas alarm: after warm-up, cannot be muted
147  if (simdi > GAZ_ISINMA) {
148    int gaz = analogRead(GAZ_PIN);             // 0-4095
149    if (!gazVar && gaz > GAZ_ESIK) {
150      gazVar = true;
151      bot.sendMessage(CHAT_ID, "GAZ ALARMI! / GAS ALARM! " + String(gaz) + " " + saat());
152    } else if (gazVar && gaz < GAZ_ESIK - GAZ_FARK) {
153      gazVar = false;
154      bot.sendMessage(CHAT_ID, "Gaz normale döndü / gas back to normal: " + String(gaz));
155    }
156  }
157
158  // 3) Telegram komutları / Telegram commands
159  if (simdi - sonKontrol > KONTROL_ARALIGI && WiFi.status() == WL_CONNECTED) {
160    int adet = bot.getUpdates(bot.last_message_received + 1);
161    while (adet) {
162      mesajlariIsle(adet);
163      adet = bot.getUpdates(bot.last_message_received + 1);
164    }
165    sonKontrol = millis();
166  }
167}
EinstellungWertErklärung
GAZ_ESIK1800Roher ADC-Wert von 0 bis 4095; lege ihn anhand deiner Messung an frischer Luft fest
GAZ_FARK200Erst wenn der Wert so weit unter die Schwelle fällt, kommt "wieder normal"; verhindert Hin-und-her-Meldungen an der Grenze
HAREKET_BEKLEME60000 msMindestens 60 Sekunden zwischen zwei Bewegungsmeldungen
GAZ_ISINMA120000 msDer MQ-2 liefert beim Aufheizen hohe Werte; Gas wird in den ersten 2 Minuten nicht geprüft
KONTROL_ARALIGI1000 msWie oft Telegram nach neuen Nachrichten gefragt wird
bot.maxMessageLength4000Die längste Antwort, die die Bibliothek liest; Standard ist 1500

Die beiden Alarme im Code arbeiten absichtlich unterschiedlich. Der Bewegungsalarm ist durch eine Sperrzeit geschützt: Ein PIR-Sensor löst immer wieder aus, solange jemand durch den Raum läuft, und ohne Sperrzeit wäre dein Handy in einer Minute voller Nachrichten. Weil der Zähler bei null beginnt, kommt die erste Meldung frühestens 60 Sekunden nach dem Start, was auch zu der knappen Minute passt, die ein PIR-Sensor nach dem Einschalten zum Einpendeln braucht. Der Gasalarm arbeitet dagegen mit Hysterese: Er warnt einmal, wenn der Wert die Schwelle überschreitet, meldet "wieder normal" erst 200 Einheiten darunter und lässt sich aus Sicherheitsgründen nicht mit /alarm_kapat stummschalten. Auch Telegram erlaubt keine Nachrichtenflut: Schickst du mehr als eine Nachricht pro Sekunde in denselben Chat oder mehr als 20 pro Minute in eine Gruppe, kommt der Fehler "Too Many Requests: retry after".

Bestimme GAZ_ESIK durch Messen, nicht durch Raten: Lass das Board 5–10 Minuten an frischer Luft laufen, schick /durum über Telegram und notiere den gemeldeten Gaswert. Setze die Schwelle einige hundert Einheiten darüber. Gut zu wissen ist auch die Variable bot.longPoll: Gibst du ihr einen Wert wie 20, wartet getUpdates bis zu 20 Sekunden auf eine neue Nachricht und Befehle werden sofort beantwortet, aber loop() steht in dieser Zeit still und die Sensoren werden nicht gelesen. Lass longPoll in Alarmprojekten auf 0.
Der MQ-2 ist ein Lern- und Hobbysensor, kein zertifizierter Gasmelder, und bei ausgefallenem WLAN oder Internet kommt auch keine Meldung an. Verlass dich zu Hause nie allein darauf, um Gaslecks zu erkennen; installiere einen normgerechten Gasmelder aus dem Handel und betrachte dieses Projekt als zusätzliche Warnung.

Telegram-Bot mit dem ESP8266 (NodeMCU)

Dieselbe Bibliothek läuft auch auf den Boards ESP8266 NodeMCU und Wemos D1 Mini; die Befehls- und Alarmlogik bleibt genau gleich, nur der Verbindungsteil ändert sich. Statt WiFi.h wird ESP8266WiFi.h eingebunden, das Stammzertifikat geht als X509List an setTrustAnchors(), und weil der ESP8266 die Gültigkeitsdaten des Zertifikats prüft, muss vor dem Verbinden die Uhrzeit per NTP geholt werden. Ohne Uhrzeit scheitert jede Verbindung stillschweigend. Die eingebaute LED des NodeMCU sitzt an D4 und leuchtet bei LOW, und es gibt nur einen Analogeingang, A0.

C++ (Arduino IDE)
1#include <ESP8266WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5#include <time.h>
6
7const char* WIFI_SSID = "AgAdi";
8const char* WIFI_PASS = "Sifre123";
9#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
10#define CHAT_ID   "123456789"
11
12X509List cert(TELEGRAM_CERTIFICATE_ROOT);      // ESP8266'da kök sertifika böyle verilir / how ESP8266 takes the root certificate
13WiFiClientSecure client;
14UniversalTelegramBot bot(BOT_TOKEN, client);
15
16void setup() {
17  Serial.begin(115200);
18  configTime(0, 0, "pool.ntp.org");            // sertifika kontrolü için saat şart / the clock is needed to check the certificate
19  client.setTrustAnchors(&cert);
20
21  WiFi.mode(WIFI_STA);
22  WiFi.begin(WIFI_SSID, WIFI_PASS);
23  while (WiFi.status() != WL_CONNECTED) delay(500);
24
25  time_t simdi = time(nullptr);                // NTP saatini bekle / wait for the NTP time
26  while (simdi < 24 * 3600) {
27    delay(100);
28    simdi = time(nullptr);
29  }
30  bot.sendMessage(CHAT_ID, "ESP8266 çevrimiçi / ESP8266 is online");
31}
32
33void loop() {
34}

Telegram-Bot mit Raspberry Pi Pico W und MicroPython

Für den Raspberry Pi Pico W brauchst du keine eigene Bibliothek; mit dem MicroPython-Modul requests schickst du Anfragen direkt an die Telegram Bot API. Der Code unten sendet bei Bewegung eine Meldung, schaltet mit /ac und /kapat das Relais an GP15 und die eingebaute LED des Boards und antwortet nur deiner Chat-ID. Spiel mit Thonny ein aktuelles MicroPython auf den Pico W und speichere den Code als main.py. Das requests-Modul von MicroPython verschlüsselt die Verbindung, prüft aber das Serverzertifikat nicht; die Sicherheit entspricht also setInsecure() beim ESP32.

MicroPython
1import network, time
2import requests
3from machine import Pin
4
5WIFI_SSID = "AgAdi"                    # Wi-Fi adın / your Wi-Fi name
6WIFI_PASS = "Sifre123"                 # Wi-Fi şifren / your Wi-Fi password
7TOKEN = "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
8CHAT_ID = 123456789                    # sayı olarak yaz / write it as a number
9API = "https://api.telegram.org/bot" + TOKEN
10
11led = Pin("LED", Pin.OUT)              # Pico W dahili LED / Pico W onboard LED
12role = Pin(15, Pin.OUT, value=1)       # aktif LOW röle kapalı başlar / active-LOW relay starts off
13pir = Pin(16, Pin.IN)                  # PIR OUT
14
15wlan = network.WLAN(network.STA_IF)
16wlan.active(True)
17wlan.connect(WIFI_SSID, WIFI_PASS)
18while not wlan.isconnected():
19    time.sleep(0.5)
20print("IP:", wlan.ifconfig()[0])
21
22def gonder(metin):
23    try:
24        r = requests.post(API + "/sendMessage", json={"chat_id": CHAT_ID, "text": metin})
25        r.close()
26    except Exception as e:
27        print("Gonderilemedi / send failed:", e)
28
29def yeni_mesajlar(offset):
30    try:
31        r = requests.get(API + "/getUpdates?timeout=0&limit=5&offset=%d" % offset)
32        sonuc = r.json().get("result", [])
33        r.close()
34        return sonuc
35    except Exception as e:
36        print("Okunamadi / read failed:", e)
37        return []
38
39# Kart kapalıyken gelen eski komutları atla / skip old commands sent while the board was off
40offset = 0
41eski = yeni_mesajlar(offset)
42while eski:
43    offset = eski[-1]["update_id"] + 1
44    eski = yeni_mesajlar(offset)
45
46gonder("Pico W çevrimiçi / Pico W is online")
47son_hareket = time.ticks_ms()          # ilk 60 sn PIR dengelenir / the PIR settles in the first 60 s
48
49while True:
50    if pir.value() and time.ticks_diff(time.ticks_ms(), son_hareket) > 60000:
51        son_hareket = time.ticks_ms()
52        gonder("Hareket algılandı! / motion detected!")
53
54    for u in yeni_mesajlar(offset):
55        offset = u["update_id"] + 1
56        mesaj = u.get("message", {})
57        if mesaj.get("chat", {}).get("id") != CHAT_ID:     # yalnız sana yanıt ver / answer only you
58            continue
59        komut = mesaj.get("text", "").split("@")[0]
60        if komut == "/ac":
61            role.value(0)              # aktif LOW: 0 = açık / active LOW: 0 = on
62            led.on()
63            gonder("Röle AÇIK / relay ON")
64        elif komut == "/kapat":
65            role.value(1)
66            led.off()
67            gonder("Röle KAPALI / relay OFF")
68        elif komut == "/durum":
69            gonder("Röle / relay: " + ("AÇIK / ON" if role.value() == 0 else "KAPALI / OFF"))
70    time.sleep(1)

Projektideen für den ESP32 Telegram Bot

  • Tür- und Fensteralarm: Mit einem Reedkontakt oder einem PIR-Sensor eine Nachricht aufs Handy schicken, wenn sich etwas bewegt, während niemand zu Hause ist.
  • Überwachungskamera mit Fotos: Bei Bewegung mit einer ESP32-CAM ein Bild aufnehmen und an Telegram senden; die Schritte stehen im Beitrag ESP32-CAM Telegram.
  • Raum- und Gewächshausüberwachung: Warnen, wenn die mit einem DHT11 gemessene Temperatur eine Grenze überschreitet, und den aktuellen Wert mit /durum abfragen.
  • Gieß-Erinnerung: Eine Meldung bekommen, wenn ein Bodenfeuchtesensor Trockenheit meldet, und die Pumpe mit einem Befehl wie /sula ("gießen") ein paar Sekunden laufen lassen.
  • Brandwarnung: Einen Flammensensor mit dem MQ-2 kombinieren und beide Gefahren gleichzeitig überwachen.
  • Batteriebetriebener Briefkastenmelder: Den ESP32 im Deep Sleep warten lassen, beim Öffnen der Klappe aufwecken, eine einzige Nachricht senden und wieder schlafen legen.
  • Fernschaltbare Steckdose: Schreibtischlampe oder Ventilator über ein Relais von überall auf der Welt mit /ac und /kapat schalten.

Häufige Fehler beim ESP32 Telegram Bot und ihre Lösungen

Symptom oder MeldungUrsacheLösung
sendMessage gibt false zurück, kein Fehler im seriellen MonitorDie Zeile setCACert oder setInsecure fehlt, im Token steckt ein Leerzeichen oder das WLAN ist nicht verbundenZertifikatszeile ergänzen, Token neu kopieren, zuerst die WLAN-Verbindung prüfen
Beim Browsertest "Forbidden: bot can't initiate conversation with a user"Du hast im Bot nie auf Starten getippt oder ihn blockiertBot in Telegram öffnen und Starten tippen; Blockierung aufheben
"Bad Request: chat not found"Falsche Chat-ID, fehlendes Minus bei einer Gruppen-ID oder der Bot wurde aus der Gruppe entferntID mit getUpdates neu auslesen, Gruppen-IDs mit Minus schreiben
"Unauthorized"Token falsch oder mit /revoke ersetztAktuellen Token bei BotFather kopieren und Code neu hochladen
Sendet Nachrichten, reagiert aber nicht auf BefehleLanges delay() in loop(), falsche Chat-ID oder in der Gruppe angehängtes @bot_nameMit millis() warten, den @-Teil abschneiden, die Zeile "unauthorized ID" im seriellen Monitor prüfen
Bot verstummt nach einem Foto oder Sticker komplettDie Bibliothek liest nur die ersten 1500 Zeichen einer Antwort; eine lange Antwort lässt sich nicht auswerten und dieselbe Nachricht kommt immer wiederIn setup() die Zeile bot.maxMessageLength = 4000; ergänzen
Das Board führt beim Start alte Befehle ausTelegram speichert ungelesene Nachrichten bis zu 24 StundenBeim Start wartende Nachrichten abholen und verwerfen
"Conflict: terminated by other getUpdates request"Derselbe Token läuft gleichzeitig auf zwei Geräten oder in einem Skript auf deinem ComputerFür jedes Gerät bei BotFather einen eigenen Bot anlegen
"Too Many Requests: retry after 30"Nachrichten werden zu dicht hintereinander gesendetSperrzeit einbauen; höchstens eine Nachricht pro Sekunde in denselben Chat
Beim Kompilieren "ArduinoJson.h: No such file or directory"Die Bibliothek ArduinoJson ist nicht installiertArduinoJson über den Bibliotheksverwalter installieren
Das Board startet beim Senden neuDie Versorgung schafft die Stromspitze beim WLAN-Senden nicht (Brownout)1-A-Netzteil, kurzes gutes Kabel und 100–470 µF Kondensator zwischen 3V3 und GND
Halte bei der Fehlersuche eine Reihenfolge ein: Prüfe zuerst im seriellen Monitor, ob das WLAN verbunden ist, teste dann im Browser den Token mit getMe und die Chat-ID mit sendMessage, und schau dir erst zuletzt den Code an. Für den Browsertest öffnest du einfach api.telegram.org/botTOKEN/sendMessage?chat_id=123456789&text=test; Telegram schreibt den Grund eines Fehlers im Klartext in die Zeile description. Hängst du schon beim WLAN fest, hilft die Anleitung ESP32 verbindet sich nicht mit dem WLAN.

Mit einem Token, einer Chat-ID und ein paar Zeilen Code ist dein ESP32 zu einem kleinen Assistenten geworden, der dir aus deinem Zuhause berichtet und deine Befehle ausführt. Du kannst das Ganze um Temperatur-, Wasserstands- oder Türsensoren erweitern und die Meldungen in eine Familiengruppe leiten. In der BlueGrays-App findest du das ESP32-Bewegungsalarmsystem mit PIR, Summer, LED und Telegram-Benachrichtigung, den MQ-2-Gas- und Rauchmelder-Alarm und die ESP32-WLAN-Projekte Schritt für Schritt mit Schaltplänen und Code.

Häufige Fragen

Ist ein ESP32 Telegram Bot kostenlos?

Ja. Einen Bot bei Telegram anzulegen, die Bot API zu nutzen und Nachrichten zu senden ist komplett kostenlos, und es gibt kein monatliches Nachrichtenkontingent. Es gibt nur Ratenlimits: etwa eine Nachricht pro Sekunde in denselben Chat und 20 Nachrichten pro Minute in eine Gruppe. Für Projekte zu Hause reicht das mehr als aus.

Wie finde ich meine Telegram Chat-ID heraus?

Am einfachsten tippst du in einem ID-Bot wie @userinfobot auf Starten; er schickt dir deine ID-Nummer. Alternativ schreibst du deinem eigenen Bot, öffnest im Browser api.telegram.org/botTOKEN/getUpdates und liest den Wert id im Abschnitt "chat" ab. Gruppen-IDs beginnen mit einem Minuszeichen.

Warum sendet mein ESP32 keine Nachrichten an Telegram?

Die häufigsten Ursachen sind, dass im Bot nie auf Starten getippt wurde, eine falsche Chat-ID, ein Leerzeichen im Token oder eine fehlende Zeile setCACert bzw. setInsecure im Code. Mit den Adressen getMe und sendMessage im Browser testest du Token und Chat-ID unabhängig vom Code. Achte außerdem darauf, dass das Board mit einem 2,4-GHz-WLAN verbunden ist.

Kann jemand anderes meinen Telegram-Bot steuern?

Bot-Benutzernamen sind öffentlich; ohne ID-Prüfung im Code kann also jeder, der den Bot findet, Befehle schicken. Wenn du die Chat-ID jeder eingehenden Nachricht mit deiner eigenen vergleichst und den Rest ignorierst, ist das ausgeschlossen, denn Telegram bestätigt die Identität des Absenders. Gib auch den Token nie weiter; ist er durchgesickert, ersetze ihn bei BotFather mit /revoke.

Kann man mit dem ESP8266 einen Telegram-Bot bauen?

Ja. Die Bibliothek UniversalTelegramBot läuft auch auf ESP8266-Boards wie NodeMCU und Wemos D1 Mini. Das Stammzertifikat wird als X509List an setTrustAnchors() übergeben, und vor dem Verbinden muss die Uhrzeit per NTP geholt werden. Weil der ESP8266 weniger Speicher hat, kommt der ESP32 mit langen Nachrichten besser zurecht.

Kann der ESP32 Fotos an Telegram senden?

Ja. Mit der Funktion sendPhotoByBinary() der Bibliothek schickst du ein mit der ESP32-CAM aufgenommenes Bild direkt an Telegram. Ein ESP32 ohne Kamera kann auf demselben Weg ein Bild von der SD-Karte senden oder mit sendPhoto() die Adresse eines Bildes im Internet. Systeme, die bei Bewegung ein Foto schicken, gehören zu den beliebtesten Sicherheitsprojekten.

Alle Projekte ansehen
LED Blinken mit ESP32
#103Anfänger

LED Blinken mit ESP32

Lehrt die grundlegende Verwendung von GPIO-Ausgängen mit ESP32. Wir erreichen einen Blinkeffekt, indem wir eine LED über einen digitalen Pin ein- und ausschalten. ESP32-Version des klassischen Blink-Projekts auf Arduino UNO; die grundlegenden Blink-Befehle in der Arduino-Umgebung bleiben gleich, aber die Pinbelegung und die GPIO-Pegel von 3,3 V des ESP32 unterscheiden sich von denen des Arduino UNO.

4.7(37)
99
ESP32 Interne LED Blinken
#106Anfänger

ESP32 Interne LED Blinken

Die eingebaute blaue LED auf dem ESP32 DevKit V1 zum Blinken bringen. Keine externen Komponenten erforderlich! Das erste Projekt, das Sie ausprobieren sollten, wenn Sie einen ESP32 kaufen. GPIO 2 ist mit der internen LED verbunden.

4.8(29)
53
ESP32 Bewegungsalarmsystem (PIR + Buzzer + LED + Telegram)
#145Fortgeschritten
Premium

ESP32 Bewegungsalarmsystem (PIR + Buzzer + LED + Telegram)

Ein intelligentes Sicherheitsalarmsystem, das Buzzer und LED aktiviert, sobald der PIR-Sensor Bewegung erkennt, und gleichzeitig eine sofortige Benachrichtigung per Telegram an den Besitzer sendet. Ein 30-sekündiger Cooldown begrenzt die Häufigkeit wiederholter Alarme; dieser Mechanismus überprüft weder die Gültigkeit der PIR-Erkennungen noch verhindert er Fehlauslösungen. Geeignet für Heimsicherheit, Garagenüberwachung, Lagerräume oder Arbeitszimmer. Mit ESP32-CAM sind Foto-Benachrichtigungen m

0.0(0)
9
ESP32 MQ-2 Gas-/Rauchmelder-Alarm
#122Mittel

ESP32 MQ-2 Gas-/Rauchmelder-Alarm

In diesem Projekt wird die Erkennung brennbarer Gase (LPG, Methan, Propan) und Rauch mit einem MQ-2-Gassensormodul durchgeführt; bei Erkennung ertönt über einen passiven Summer ein sirenenähnlicher Alarmton. Der digitale Schwellenausgang (DO) des Sensors wird an GPIO 4 des ESP32 angeschlossen; überschreiten Gas oder Rauch den Schwellenwert, geht DO auf LOW und der Alarm wird ausgelöst. Die Empfindlichkeit wird über das Potentiometer eingestellt. Der passive Summer wird mit tone() angesteuert.

4.7(28)
43
ESP32 Intelligente Beleuchtung (PIR + LDR + Relais + OLED)
#141Fortgeschritten
Premium

ESP32 Intelligente Beleuchtung (PIR + LDR + Relais + OLED)

Verwandle deinen Flur, dein Badezimmer oder deine Speisekammer mit dem ESP32 in intelligente Beleuchtung! Mit einem PIR-Bewegungssensor, einem LDR-Lichtsensor und einem Relaismodul realisieren wir das klassische Szenario "Licht geht an, wenn im Dunkeln Bewegung erkannt wird" — bei Tageslicht bleibt das Licht trotz Bewegung aus, was tagsüber Energie spart. Das Licht bleibt 30 Sekunden lang an; bei anhaltender Bewegung wird der Timer zurückgesetzt und das Licht bleibt länger an. Das SSD1306 OLED-D

4.3(6)
11
Automatische Beleuchtung mit dem ESP32-PIR-Bewegungssensor
#121Mittel
Premium

Automatische Beleuchtung mit dem ESP32-PIR-Bewegungssensor

In diesem Projekt werden wir mithilfe des PIR-Bewegungssensors HC-SR501 Personen erkennen, die den Raum betreten, und die LED automatisch einschalten. Wir überwachen die Leuchtdauer der LED mit millis(); bei jedem HIGH-Messwert des Sensors wird der Zeitpunkt der letzten Bewegung aktualisiert, und die LED erlischt frühestens 10 Sekunden nach dem letzten HIGH-Messwert. Der aktuelle Code wartet außerdem in jedem Schleifendurchlauf mit delay(50) für 50 ms, sodass die Anwendungsschleife nicht vol

4.4(24)
38
ESP32-WLAN-STA-Verbindung (mit LCD-Display)
#127Fortgeschritten

ESP32-WLAN-STA-Verbindung (mit LCD-Display)

In diesem Projekt verbinden wir den ESP32 im Station-Modus (STA) sicher und fehlertolerant mit dem heimischen WLAN. Wir lagern SSID und Passwort in eine separate secrets.h-Datei aus, um Leaks zu Git zu verhindern, richten einen Auto-Reconnect-Mechanismus ein und zeigen RSSI-Signalpegel und IP-Adresse auf einem I2C-LCD-Display an. Die interne LED dient als Statusanzeige. Ein Verbindungsmanager auf Produktionsniveau.

4.4(21)
34