Node-RED ve Telegram'ı birleştirmek, MQTT cihazlarından uyarı almanın ve telefonunuzdan onlara komut göndermenin ücretsiz ve anlık bir yolunu sunar. Bu rehberde bir Telegram botu oluşturacak, onu Node-RED'e bağlayacak, bir MQTT topic'inden eşik uyarılarını iletecek, /status komutunu en son okumayla yanıtlayacak ve /on ile /off komutlarıyla bir röleyi kontrol edeceksiniz; bu sırada izin listenizde olmayan herkesi yok sayacaksınız.
Telegram IoT Bildirimleri için Neden İyi Çalışır
E-posta raporlar için iyidir, ancak fark edilmesi yavaştır ve kolayca filtrelenip kaybolur. Telegram botlarını oluşturmak ücretsizdir, anlık bildirimler telefona hızla ulaşır ve Bot API iki yönlüdür: bir uyarı alan aynı sohbet bir komutla yanıt verebilir. Bir ev laboratuvarı, bir sera, küçük bir atölye veya nöbetçi bir bakım ekibi için bu, çoğu zaman tam olarak doğru miktarda araçtır.
Node-RED, MQTT'yi zaten yerel olarak konuştuğu için bot için iyi bir ev sahibidir. Bot cihazlarınızla asla doğrudan konuşmaz. Node-RED ile konuşur ve Node-RED broker üzerinde yayın yapar ve abone olur; bu da cihazlarınızı basit ve Telegram'dan tamamen habersiz tutar.
Neye İhtiyacınız Var
- Çalışan bir Node-RED örneği (yerel, Raspberry Pi veya Docker).
- Bir Telegram hesabı.
- Bir MQTT broker. Bu rehber ConnectMQ kullanıyor; test için broker.connectmq.com adresindeki herkese açık MQTT test broker'ını
connectmq/demo/tg42x9önekiyle kullanıyoruz.tg42x9yerine kendi rastgele dizenizi kullanın. node-red-contrib-telegrambotpaketi.
Herkese açık demo alanının altındaki her şey diğer kullanıcılar tarafından okunabildiği için oraya gerçek ekipmanlara yönelik gerçek komutlar yayınlamayın. Önemli bir şey bağlamadan önce özel kimlik bilgilerine geçin.
Adım 1: Botu BotFather ile Oluşturun
Telegram'da @BotFather ile bir sohbet açın ve /newbot gönderin. Bir görünen ad ve bot ile biten bir kullanıcı adı seçin. BotFather, 123456789:AA... gibi görünen bir API token'ı ile yanıt verir. Bunu bir parola gibi değerlendirin: token'a sahip olan herkes botu kontrol edebilir.
İsteğe bağlı olarak BotFather'a /setcommands gönderin ve Telegram'ın öneriler göstermesi için komut listesini kaydedin:
status - Show the latest sensor values
on - Switch the relay on
off - Switch the relay off
Adım 2: Telegram Node'larını Kurun ve Yapılandırın
Menu → Manage palette üzerinden node-red-contrib-telegrambot paketini kurun. Kullanacağımız üç node'u ekler:
| Node | Amaç |
|---|---|
| Telegram receiver | Bota gönderilen her mesajı çıkarır |
| Telegram command | Yalnızca /status gibi belirli bir komut alındığında çıkarır |
| Telegram sender | Bir sohbete mesaj, fotoğraf veya başka içerik gönderir |
Bir bot yapılandırma node'u oluşturun, token'ı yapıştırın ve varsayılan polling modunu kullanın. Polling, NAT ve ev router'larının arkasında çalışır; çünkü Node-RED gelen bağlantıları beklemek yerine güncellemeleri Telegram'dan çeker. Yapılandırma node'u ayrıca botu belirli kullanıcı adları veya chat ID'leriyle sınırlamanıza olanak tanır. Bunu kullanın ve ikinci bir katman olarak akışa kendi kontrolünüzü ekleyin.
Chat ID'nizi bulun
Bir Telegram receiver node'unu tam mesajı gösterecek şekilde ayarlanmış bir debug node'una bağlayın, deploy edin ve botunuza herhangi bir metin gönderin. Debug kenar çubuğu msg.payload.chatId değerini gösterir. Bunu not edin; izin listesi ve kendiliğinden gönderilen uyarılar için kullanacaksınız.
Adım 3: MQTT Uyarılarını Telegram'a İletin
Sender node'u, msg.payload'un chat ID, tip ve içerik içeren bir nesne olmasını bekler. Bir mqtt in node'uyla bir uyarı topic'ine (connectmq/demo/tg42x9/alerts/#) abone olun ve her mesajı bir function node'uyla dönüştürün:
const CHAT_ID = 123456789; // debug kenar çubuğundaki chat ID'niz
let text = msg.payload;
if (typeof text === "object") text = JSON.stringify(text);
// connectmq/demo/tg42x9/alerts/freezer gibi bir topic -> "freezer"
const source = msg.topic.split("/").pop();
msg.payload = {
chatId: CHAT_ID,
type: "message",
content: `Alert from ${source}: ${text}`
};
return msg;
Bunu bir Telegram sender node'una bağlayın. Uyarılarınız özel bir uyarı topic'i yerine ham sensör değerlerinden geliyorsa, botun her okumada size mesaj atmaması için Node-RED e-posta uyarı rehberimizdeki histerezis ve bekleme süresi mantığını bu function'ın önüne koyun.
Adım 4: /status Komutunu En Son Değerlerle Yanıtlayın
Her sensörün son değerini flow context'te tutun. connectmq/demo/tg42x9/sensors/# topic'ine abone olun ve her okumayı saklayın:
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;
Ardından /status komutuna sahip bir Telegram command node'u ekleyin, arkasına şu function'ı ve bir Telegram sender koyun:
const ALLOWED = [123456789]; // izin verilen chat ID'leri
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;
Son okumanın zamanını eklemek önemlidir. Normal görünen ama iki saat önceye ait bir değer genellikle cihazın çevrimdışı olduğunun işaretidir.
Adım 5: MQTT Cihazlarına Komut Gönderin
/on ve /off için Telegram command node'ları ekleyin. Her ikisi de göndereni kontrol eden ve iki mesaj oluşturan tek bir function node'unu besler: cihaz için bir komut ve sohbet için bir onay.
const ALLOWED = [123456789];
const chatId = msg.payload.chatId;
if (!ALLOWED.includes(chatId)) return [null, null];
// Command node'unda yapılandırılan komut hangisinin tetiklendiğini söyler
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];
Function'ı iki çıkışlı yapın, ilkini bir mqtt out node'una, ikincisini bir Telegram sender'a bağlayın. Node sürümünüzde content alanı komut metnini içermiyorsa, durumu sabit kodlanmış, komut başına bir tane olmak üzere iki ayrı function node'u kullanın. Bu daha az zekice ama daha sağlamdır.
Daha iyi bir yanıt, cihazın onaylamasını bekler. Cihazın gerçek durumunu connectmq/demo/tg42x9/relay1/state topic'ine yayınlamasını sağlayın ve bu topic'i Adım 3'teki uyarı function'ıyla Telegram'a iletin. Böylece yalnızca bir komutun Node-RED'den çıktığını değil, rölenin gerçekten anahtarlandığını bilirsiniz. Node-RED HTTP'den MQTT'ye rehberimiz HTTP çağıranlar için aynı komut ve onay desenini kullanır.
Tüm Döngüyü Test Edin
# Komut topic'ini izle
mosquitto_sub -h broker.connectmq.com -p 1883 -i watch-tg42x9 -v -t "connectmq/demo/tg42x9/#"
# Bir sensörü ve bir uyarıyı simüle et
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"
Ardından bota /status, /on ve /off gönderin ve komut mesajlarının subscriber terminalinde görünmesini izleyin.
Bir Node-RED Telegram Botu için Güvenlik Kontrol Listesi
Ekipmanı anahtarlayabilen bir bot bir uzaktan kumandadır, bu yüzden ona öyle davranın:
- Chat ID'lerini bot yapılandırma node'unda ve bir komuta göre işlem yapan her function'da yeniden izin listesine alın.
- Token'ı gizli tutun. Dışa aktardığınız veya commit ettiğiniz akış JSON'unda değil, yapılandırma node'unun kimlik bilgilerinde durur.
- Demonun ötesindeki her şey için özel ConnectMQ kimlik bilgilerini ve TLS'i (port 8883) kullanın. Herkese açık broker'da herkes herhangi bir demo topic'i altında okuyabilir ve yayın yapabilir.
- Komutları idempotent yapın.
/onkomutunu iki kez göndermek röleyi değiştirmemeli, açık bırakmalıdır. - Her komutu chat ID ve zamanla kaydedin; örneğin bir veritabanına veya retained bir denetim topic'ine.
- Editörü koruyun. Kimsenin akışı ve izin listesini değiştirememesi için
settings.jsiçindeadminAuth'u etkinleştirin.
Sorun Giderme
| Belirti | Çözüm |
|---|---|
| Bot hiç yanıt vermiyor | Bir bot token'ını yalnızca bir süreç sorgulayabilir; aynı token'ı kullanan diğer Node-RED örneklerini veya betikleri durdurun |
| 401 Unauthorized hatası | Token yanlış kopyalanmış veya BotFather üzerinden iptal edilmiş |
| Command node'u bir grupta hiç tetiklenmiyor | Grup gizlilik modu açık; bota /status@yourbot şeklinde hitap edin veya BotFather ile gizliliği kapatın |
| Uyarılar dakikalar geç geliyor | mqtt in node'undaki MQTT bağlantı durumunu kontrol edin ve QoS 1 kullanın |
| Röle iki kez anahtarlanıyor | Aynı function'a bağlı iki command node'u veya set topic'inde retained bir komut |
Node-RED Telegram Botunuzu ConnectMQ'da Çalıştırın
Bot demo broker'da çalıştığında, Node-RED broker yapılandırmasını özel bir ConnectMQ broker'ına geçirin: TLS ile port 8883 ve portalda üretilen kullanıcı adı, parola ve client ID. Portalın tarayıcı içi MQTT istemcisi ve canlı topic gezgini, telefonunuzdan test ederken komut ve durum topic'lerini izlemek için kullanışlıdır. app.connectmq.com adresinde kredi kartı olmadan ücretsiz Serverless planına kaydolun. Broker'ınızın nerede çalışması gerektiğine hâlâ karar veriyorsanız buluttaki MQTT broker genel bakışımız seçenekleri açıklar ve Node-RED MQTT rehberi Node-RED temellerinin geri kalanını ele alır.
Sık Sorulan Sorular
Telegram için hangi Node-RED paketini kullanmalıyım?
node-red-contrib-telegrambot en yaygın kullanılan seçenektir. Receiver, command ve sender node'ları sağlar, polling ve webhook modlarını destekler ve erişimi bilinen kullanıcılar veya sohbetlerle sınırlayabilir.
Herkese açık bir IP'ye veya port yönlendirmeye ihtiyacım var mı?
Hayır. Polling modunda Node-RED Telegram'a giden istekler yapar ve MQTT de broker'a giden bir bağlantıdır; bu nedenle her ikisi de bir ev router'ının arkasında çalışır.
Aynı botu birden fazla kişi kullanabilir mi?
Evet. Her kişinin chat ID'sini izin listesine ekleyin ya da botu bir gruba ekleyip uyarılar için grup chat ID'sini kullanın.
Cihazları Telegram'dan kontrol etmek güvenli mi?
Chat ID'lerini kısıtlar, token'ı gizli tutar, TLS ile özel broker kimlik bilgileri kullanır ve her komutu kaydederseniz güvenli olabilir. Yerel kilitlemeler gerektiren güvenlik açısından kritik ekipmanlar için bundan kaçının.



