commit d01b53242e7670bfa5bf9a1f29f767cc4a61297b Author: klaas Date: Mon Sep 9 17:18:36 2024 +0200 initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..1b867e0 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# Arduino Telegram Bot - README + +## Übersicht + +Dieses Projekt implementiert einen Telegram-Bot auf einem ESP8266-Mikrocontroller, der mit einem Telegram-Konto verbunden ist und Nachrichten basierend auf einem externen Eingang (z.B. einem Taster) sendet. Das Setup verwendet die ESP8266WiFi-Bibliothek, um den ESP8266 mit einem WLAN-Netzwerk zu verbinden, und die UniversalTelegramBot-Bibliothek, um den Bot zu steuern. + +## Funktionen + +- **Telegram Bot Integration:** Der ESP8266 ist mit einem Telegram-Bot verbunden, der Nachrichten an einen vordefinierten Chat sendet. +- **Eingangserkennung:** Ein GPIO-Pin wird als Eingang verwendet, um ein externes Signal (z.B. ein Tastendruck) zu erfassen. Wenn ein Signal erkannt wird, sendet der Bot eine Nachricht an den definierten Telegram-Chat. +- **Prellschutz:** Der Code enthält einen einfachen Mechanismus, um Prellen des Tasters zu vermeiden. + +## Komponenten + +- **ESP8266 Mikrocontroller** (z.B. NodeMCU) +- **Taster** oder andere Eingangsquelle, die an den definierten GPIO-Pin angeschlossen ist +- **WLAN Netzwerk** mit Zugangsdaten +- **Telegram Bot Token** und **Chat ID** + +## Bibliotheken + +Die folgenden Bibliotheken werden verwendet: + +- `ESP8266WiFi.h`: Ermöglicht die WLAN-Verbindung des ESP8266. +- `WiFiClientSecure.h`: Bietet sichere (SSL) Verbindungen für den ESP8266. +- `UniversalTelegramBot.h`: Ermöglicht die Steuerung eines Telegram-Bots. + +## Installation + +1. **Arduino IDE vorbereiten:** + - Installiere die Arduino IDE, falls noch nicht geschehen. + - Installiere das ESP8266 Board-Paket über den Board-Manager. + - Installiere die benötigten Bibliotheken (`ESP8266WiFi`, `WiFiClientSecure`, `UniversalTelegramBot`) über den Bibliotheks-Manager der Arduino IDE. + +2. **Telegram Bot erstellen:** + - Erstelle einen neuen Bot über den [@BotFather](https://t.me/BotFather) auf Telegram und notiere dir den generierten Bot Token. + +3. **Projektkonfiguration:** + - Ersetze die Platzhalter `WIFISSID`, `WFIPASS`, `TOKEN`, und `chatID` im Code durch die tatsächlichen Werte für dein WLAN und den Telegram Bot. + +4. **Verkabelung:** + - Verbinde den Taster (oder einen anderen Eingang) mit dem entsprechenden GPIO-Pin des ESP8266 (z.B. GPIO0, D1 auf einem NodeMCU). + +## Nutzung + +1. **Upload:** Lade den Sketch auf deinen ESP8266 hoch. +2. **Verbindung:** Der ESP8266 verbindet sich mit dem angegebenen WLAN und startet den Telegram-Bot. +3. **Eingabe Erkennen:** Drücke den angeschlossenen Taster, um eine Nachricht ("Ding Dong") an den konfigurierten Telegram-Chat zu senden. +4. **Nachrichtenüberprüfung:** Der ESP8266 überprüft regelmäßig auf neue Nachrichten im Bot-Chat, die in der Konsole angezeigt werden. + +## Anpassungen + +- **Eingabepin:** Der Eingabepin kann in der `inputPin`-Variable definiert und an die spezifischen Anforderungen angepasst werden. +- **Bot-Konfiguration:** Anpassungen an der Frequenz der Nachrichtenüberprüfung (`BOT_MTBS`) und anderen Bot-Einstellungen können vorgenommen werden. + +## Fehlersuche + +- **Verbindung fehlgeschlagen:** Überprüfe WLAN-SSID und Passwort. +- **Keine Nachrichten gesendet:** Überprüfe den Status des GPIO-Pins und stelle sicher, dass der Bot korrekt eingerichtet ist. +- **Sicherheitswarnungen:** Stelle sicher, dass das Root-Zertifikat für Telegram korrekt eingebunden ist. + +## Lizenz + +Dieses Projekt steht unter der MIT-Lizenz - siehe die [LICENSE.md] diff --git a/klingelbot.ino b/klingelbot.ino new file mode 100644 index 0000000..836fa60 --- /dev/null +++ b/klingelbot.ino @@ -0,0 +1,112 @@ +#include +#include +#include + +// Wifi network station credentials +#define WIFI_SSID WIFISSID +#define WIFI_PASSWORD WIFIPASS + +#define BOT_TOKEN BOTTOKEN + +const String CHAT_ID = CHATID; +const unsigned long BOT_MTBS = 1000; // mean time between scan messages + +// GPIO Pin Definition +const int inputPin = 0; + +// Initiale Zustandsvariablen +bool lastState = LOW; +bool again = true; +int count = 0; +X509List cert(TELEGRAM_CERTIFICATE_ROOT); +WiFiClientSecure secured_client; +UniversalTelegramBot bot(BOT_TOKEN, secured_client); +unsigned long bot_lasttime; // last time messages' scan has been done +bool Start = false; + +void handleNewMessages(int numNewMessages) +{ + Serial.println("handleNewMessages"); + Serial.println(String(numNewMessages)); + + for (int i = 0; i < numNewMessages; i++) + { + String chat_id = bot.messages[i].chat_id; + String text = bot.messages[i].text; + + String from_name = bot.messages[i].from_name; + if (from_name == "") + from_name = "Guest"; + + if (text == "/send_test_action") + { + bot.sendChatAction(chat_id, "typing"); + delay(4000); + bot.sendMessage(chat_id, "Did you see the action message?"); + } + + if (text == "/start") + { + String welcome = "Willkommen beim Klingelbot"; + bot.sendMessage(chat_id, welcome); + } + } +} + +void setup() +{ + Serial.begin(115200); + + pinMode(inputPin, INPUT_PULLUP); + // Set WiFi to station mode and disconnect from an AP if it was Previously + // connected + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + delay(100); + + // attempt to connect to Wifi network: + Serial.print("Connecting to Wifi SSID "); + Serial.print(WIFI_SSID); + Serial.print(" "); + WiFi.begin(WIFI_SSID, WIFI_PASSWORD); + secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org + while (WiFi.status() != WL_CONNECTED) + { + Serial.print("."); + delay(500); + } + Serial.println(); + + Serial.print("WiFi connected. IP address: "); + Serial.println(WiFi.localIP()); +} + +void loop() +{ + if (millis() - bot_lasttime > BOT_MTBS) + { + int numNewMessages = bot.getUpdates(bot.last_message_received + 1); + + while (numNewMessages) + { + Serial.println("got response"); + handleNewMessages(numNewMessages); + numNewMessages = bot.getUpdates(bot.last_message_received + 1); + } + delay(100); // Kurze Pause, um Prellen zu vermeiden + bot_lasttime = millis(); + } + if (digitalRead(inputPin) == LOW) { + if (again) { + bot.sendMessage(CHAT_ID, "Ding Dong"); + again = false; + } else { + count ++; + Serial.println (count); + if (count >20) { + again = true; + count=0; + } + } + } +}