Die Kombination aus Node-RED und Telegram bietet einen kostenlosen, sofortigen Weg, Alarme von MQTT-Geräten zu empfangen und ihnen vom Smartphone aus Befehle zu senden. In diesem Tutorial erstellen Sie einen Telegram-Bot, verbinden ihn mit Node-RED, leiten Grenzwertalarme aus einem MQTT-Topic weiter, beantworten einen /status-Befehl mit dem letzten Messwert und schalten ein Relais mit /on und /off – während alle ignoriert werden, die nicht auf Ihrer Freigabeliste stehen.
Warum sich Telegram gut für IoT-Benachrichtigungen eignet
E-Mail ist gut für Berichte, wird aber spät bemerkt und landet leicht im Filter. Telegram-Bots lassen sich kostenlos anlegen, Push-Benachrichtigungen erreichen das Handy schnell, und die Bot-API arbeitet in beide Richtungen: Derselbe Chat, der einen Alarm empfängt, kann mit einem Befehl antworten. Für ein Heimlabor, ein Gewächshaus, eine kleine Werkstatt oder ein Instandhaltungsteam in Rufbereitschaft ist das oft genau das richtige Maß an Werkzeug.
Node-RED ist ein guter Host für den Bot, weil es MQTT bereits nativ spricht. Der Bot kommuniziert nie direkt mit Ihren Geräten. Er spricht mit Node-RED, und Node-RED publiziert und abonniert auf dem Broker. So bleiben Ihre Geräte einfach und wissen nichts von Telegram.
Was Sie benötigen
- Eine laufende Node-RED-Instanz (lokal, auf einem Raspberry Pi oder in Docker).
- Ein Telegram-Konto.
- Einen MQTT-Broker. Dieser Leitfaden verwendet ConnectMQ; zum Testen nutzen wir den Öffentlichen MQTT-Broker unter broker.connectmq.com mit dem Präfix
connectmq/demo/tg42x9. Ersetzen Sietg42x9durch Ihren eigenen Zufallsstring. - Das Paket
node-red-contrib-telegrambot.
Da alles im öffentlichen Demo-Bereich von anderen Nutzern gelesen werden kann, publizieren Sie dort keine echten Befehle für echte Anlagen. Wechseln Sie auf private Zugangsdaten, bevor Sie etwas Wichtiges anbinden.
Schritt 1: Den Bot mit BotFather anlegen
Öffnen Sie in Telegram einen Chat mit @BotFather und senden Sie /newbot. Wählen Sie einen Anzeigenamen und einen Benutzernamen, der auf bot endet. BotFather antwortet mit einem API-Token im Format 123456789:AA.... Behandeln Sie es wie ein Passwort: Wer das Token besitzt, kann den Bot steuern.
Optional senden Sie /setcommands an BotFather und registrieren die Befehlsliste, damit Telegram Vorschläge anzeigt:
status - Show the latest sensor values
on - Switch the relay on
off - Switch the relay off
Schritt 2: Die Telegram-Nodes installieren und konfigurieren
Installieren Sie node-red-contrib-telegrambot über Menü → Manage palette. Das Paket fügt drei Nodes hinzu, die wir verwenden:
| Node | Zweck |
|---|---|
| Telegram receiver | Gibt jede an den Bot gesendete Nachricht aus |
| Telegram command | Löst nur aus, wenn ein bestimmter Befehl wie /status empfangen wird |
| Telegram sender | Sendet eine Nachricht, ein Foto oder andere Inhalte an einen Chat |
Legen Sie einen Bot-Konfigurations-Node an, fügen Sie das Token ein und verwenden Sie den Standardmodus Polling. Polling funktioniert hinter NAT und Heimroutern, weil Node-RED Updates bei Telegram abholt, statt auf eingehende Verbindungen zu warten. Im Konfigurations-Node können Sie den Bot außerdem auf bestimmte Benutzernamen oder Chat-IDs beschränken. Nutzen Sie das und ergänzen Sie im Flow eine eigene Prüfung als zweite Schutzschicht.
Ihre Chat-ID ermitteln
Verbinden Sie einen Telegram-receiver-Node mit einem Debug-Node, der die komplette Nachricht anzeigt, deployen Sie und senden Sie einen beliebigen Text an Ihren Bot. Die Debug-Sidebar zeigt msg.payload.chatId. Notieren Sie den Wert; Sie brauchen ihn für die Freigabeliste und für unaufgeforderte Alarme.
Schritt 3: MQTT-Alarme an Telegram weiterleiten
Der Sender-Node erwartet in msg.payload ein Objekt mit Chat-ID, Typ und Inhalt. Abonnieren Sie mit einem mqtt-in-Node ein Alarm-Topic (connectmq/demo/tg42x9/alerts/#) und wandeln Sie jede Nachricht mit einem Function-Node um:
const CHAT_ID = 123456789; // your chat ID from the debug sidebar
let text = msg.payload;
if (typeof text === "object") text = JSON.stringify(text);
// Topic like connectmq/demo/tg42x9/alerts/freezer -> "freezer"
const source = msg.topic.split("/").pop();
msg.payload = {
chatId: CHAT_ID,
type: "message",
content: `Alert from ${source}: ${text}`
};
return msg;
Verbinden Sie ihn mit einem Telegram-sender-Node. Wenn Ihre Alarme aus Rohwerten von Sensoren statt aus einem eigenen Alarm-Topic stammen, setzen Sie die Hysterese- und Cooldown-Logik aus unserem Node-RED-Tutorial für E-Mail-Alarme vor diese Funktion, damit der Bot Ihnen nicht bei jedem Messwert schreibt.
Schritt 4: /status mit den letzten Werten beantworten
Halten Sie den letzten Wert jedes Sensors im Flow-Context. Abonnieren Sie connectmq/demo/tg42x9/sensors/# und speichern Sie jeden Messwert:
const name = msg.topic.split("/").pop();
const latest = flow.get("latest") || {};
latest[name] = { value: msg.payload, at: new Date().toISOString() };
flow.set("latest", latest);
return null;
Fügen Sie dann einen Telegram-command-Node mit dem Befehl /status hinzu, gefolgt von dieser Funktion und einem Telegram-sender:
const ALLOWED = [123456789]; // allowed chat IDs
const chatId = msg.payload.chatId;
if (!ALLOWED.includes(chatId)) {
node.warn("Ignored /status from chat " + chatId);
return null;
}
const latest = flow.get("latest") || {};
const names = Object.keys(latest);
let text;
if (names.length === 0) {
text = "No sensor data received yet.";
} else {
text = names
.map(n => `${n}: ${JSON.stringify(latest[n].value)} (at ${latest[n].at.substring(11, 19)} UTC)`)
.join("\n");
}
msg.payload = { chatId, type: "message", content: text };
return msg;
Die Uhrzeit des letzten Messwerts mitzuliefern ist wichtig. Ein Wert, der normal aussieht, aber zwei Stunden alt ist, deutet meist darauf hin, dass das Gerät offline ist.
Schritt 5: Befehle an MQTT-Geräte senden
Fügen Sie Telegram-command-Nodes für /on und /off hinzu. Beide speisen einen Function-Node, der den Absender prüft und zwei Nachrichten erzeugt: einen Befehl für das Gerät und eine Bestätigung für den Chat.
const ALLOWED = [123456789];
const chatId = msg.payload.chatId;
if (!ALLOWED.includes(chatId)) return [null, null];
// The command node's configured command tells us which one fired
const text = (msg.payload.content || "").toString().toLowerCase();
const state = text.includes("off") ? "OFF" : "ON";
const mqttMsg = {
topic: "connectmq/demo/tg42x9/relay1/set",
payload: JSON.stringify({ state, by: "telegram", chatId }),
qos: 1,
retain: false
};
const reply = {
payload: { chatId, type: "message", content: `Relay 1 command sent: ${state}` }
};
return [mqttMsg, reply];
Stellen Sie die Funktion auf zwei Ausgänge, verbinden Sie den ersten mit einem mqtt-out-Node und den zweiten mit einem Telegram-sender. Falls das Content-Feld in Ihrer Version des Nodes den Befehlstext nicht enthält, verwenden Sie zwei getrennte Function-Nodes, einen pro Befehl, mit fest codiertem Zustand. Das ist weniger elegant, aber robuster.
Eine bessere Antwort wartet auf die Bestätigung des Geräts. Lassen Sie das Gerät seinen tatsächlichen Zustand auf connectmq/demo/tg42x9/relay1/state publizieren und leiten Sie dieses Topic mit der Alarmfunktion aus Schritt 3 an Telegram weiter. Dann wissen Sie, dass das Relais geschaltet hat, und nicht nur, dass ein Befehl Node-RED verlassen hat. Unser Leitfaden Node-RED HTTP zu MQTT nutzt dasselbe Befehl-und-Bestätigung-Muster für HTTP-Aufrufer.
Den gesamten Kreislauf testen
# Watch the command topic
mosquitto_sub -h broker.connectmq.com -p 1883 -i watch-tg42x9 -v -t "connectmq/demo/tg42x9/#"
# Simulate a sensor and an alert
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-tg42x9 -t "connectmq/demo/tg42x9/sensors/freezer" -m "-17.5"
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-tg42x9 -t "connectmq/demo/tg42x9/alerts/freezer" -m "Door open for 5 minutes"
Senden Sie dann /status, /on und /off an den Bot und beobachten Sie, wie die Befehlsnachrichten im Subscriber-Terminal erscheinen.
Sicherheits-Checkliste für einen Node-RED-Telegram-Bot
Ein Bot, der Anlagen schalten kann, ist eine Fernbedienung – behandeln Sie ihn auch so:
- Freigabeliste für Chat-IDs im Bot-Konfigurations-Node und zusätzlich in jeder Funktion, die auf einen Befehl reagiert.
- Token geheim halten. Es liegt in den Credentials des Konfigurations-Nodes, nicht im Flow-JSON, das Sie exportieren oder committen.
- Private ConnectMQ-Zugangsdaten und TLS (Port 8883) für alles, was über eine Demo hinausgeht. Auf dem öffentlichen MQTT-Broker kann jeder unter jedem Demo-Topic lesen und publizieren.
- Befehle idempotent gestalten. Zweimal
/onzu senden sollte das Relais eingeschaltet lassen und es nicht umschalten. - Jeden Befehl protokollieren, mit Chat-ID und Uhrzeit, etwa in einer Datenbank oder einem retained Audit-Topic.
- Den Editor schützen. Aktivieren Sie
adminAuthinsettings.js, damit niemand den Flow und die Freigabeliste ändern kann.
Fehlerbehebung
| Symptom | Lösung |
|---|---|
| Bot reagiert überhaupt nicht | Nur ein Prozess kann ein Bot-Token pollen; stoppen Sie andere Node-RED-Instanzen oder Skripte mit demselben Token |
| Fehler 401 Unauthorized | Token falsch kopiert oder über BotFather widerrufen |
| Command-Node löst in einer Gruppe nie aus | Gruppen-Privacy-Modus ist aktiv; sprechen Sie den Bot mit /status@yourbot an oder deaktivieren Sie Privacy über BotFather |
| Alarme kommen Minuten zu spät | MQTT-Verbindungsstatus am mqtt-in-Node prüfen und QoS 1 verwenden |
| Relais schaltet zweimal | Zwei Command-Nodes an derselben Funktion oder ein retained Befehl auf dem Set-Topic |
Ihren Node-RED-Telegram-Bot auf ConnectMQ betreiben
Sobald der Bot auf dem Demo-Broker funktioniert, stellen Sie die Broker-Konfiguration in Node-RED auf einen privaten ConnectMQ-Broker um: Port 8883 mit TLS sowie Benutzername, Passwort und Client ID aus dem Portal. Der MQTT-Client im Browser und der Live-Topic-Explorer im Portal sind praktisch, um Befehls- und Status-Topics zu beobachten, während Sie vom Handy aus testen. Registrieren Sie sich für den kostenlosen Serverless-Plan unter app.connectmq.com, ohne Kreditkarte. Wenn Sie noch überlegen, wo Ihr Broker laufen soll, erklärt unsere Übersicht zum Cloud-MQTT-Broker die Optionen, und das Node-RED-MQTT-Tutorial deckt die übrigen Node-RED-Grundlagen ab.
Häufig gestellte Fragen
Welches Node-RED-Paket sollte ich für Telegram verwenden?
node-red-contrib-telegrambot ist die am weitesten verbreitete Option. Es bietet Receiver-, Command- und Sender-Nodes, unterstützt Polling- und Webhook-Modus und kann den Zugriff auf bekannte Nutzer oder Chats beschränken.
Brauche ich eine öffentliche IP oder Portweiterleitung?
Nein. Im Polling-Modus stellt Node-RED ausgehende Anfragen an Telegram, und MQTT ist ebenfalls eine ausgehende Verbindung zum Broker. Beides funktioniert also hinter einem Heimrouter.
Können mehrere Personen denselben Bot nutzen?
Ja. Fügen Sie die Chat-ID jeder Person zur Freigabeliste hinzu oder nehmen Sie den Bot in eine Gruppe auf und verwenden Sie die Gruppen-Chat-ID für Alarme.
Ist es sicher, Geräte über Telegram zu steuern?
Das kann es sein, wenn Sie Chat-IDs beschränken, das Token geheim halten, private Broker-Zugangsdaten mit TLS verwenden und jeden Befehl protokollieren. Für sicherheitskritische Anlagen, die lokale Verriegelungen benötigen, sollten Sie darauf verzichten.



