Node-RED

Node-RED-Telegram-Bot für MQTT-Geräte: Alarme, Statusabfragen und Fernbefehle

Machen Sie Telegram zum Bedienfeld für die Hosentasche. Dieses Tutorial baut einen Node-RED-Telegram-Bot, der Alarme weiterleitet, /status beantwortet, ein Relais mit /on und /off schaltet und nur auf freigegebene Chat-IDs hört.

Node-RED-Telegram-Bot, der über einen Cloud-MQTT-Broker Alarme und Befehle mit MQTT-Geräten austauscht
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

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

  1. Eine laufende Node-RED-Instanz (lokal, auf einem Raspberry Pi oder in Docker).
  2. Ein Telegram-Konto.
  3. 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 Sie tg42x9 durch Ihren eigenen Zufallsstring.
  4. 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:

  1. Freigabeliste für Chat-IDs im Bot-Konfigurations-Node und zusätzlich in jeder Funktion, die auf einen Befehl reagiert.
  2. Token geheim halten. Es liegt in den Credentials des Konfigurations-Nodes, nicht im Flow-JSON, das Sie exportieren oder committen.
  3. 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.
  4. Befehle idempotent gestalten. Zweimal /on zu senden sollte das Relais eingeschaltet lassen und es nicht umschalten.
  5. Jeden Befehl protokollieren, mit Chat-ID und Uhrzeit, etwa in einer Datenbank oder einem retained Audit-Topic.
  6. Den Editor schützen. Aktivieren Sie adminAuth in settings.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.

Verwandte Artikel

Node-RED als OPC-UA-Client zu MQTT mit ISA-95-Topics

Mit node-red-contrib-opcua OPC-UA-Variablen auf einer SPS oder einem Simulationsserver abonnieren, Node-IDs auf MQTT-Topics im ISA-95-Stil abbilden und Werte mit Qualität und Zeitstempel publizieren.

9 Min. Lesezeit

Node-RED Diagramm-Verlauf: MQTT-Chartdaten über Neustarts hinweg behalten

Dashboard-Diagramme vergessen alles, wenn Node-RED neu startet. Dieser Leitfaden zeigt zwei zuverlässige Wege, den Node-RED Diagramm-Verlauf für MQTT-Daten zu behalten: dateibasierten Context-Speicher und eine kleine SQLite-Tabelle, beide beim Start in Dashboard 2.0 zurückgespielt.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.