Uygulamalı Eğitimler

n8n ile MQTT Otomasyonları: Trigger, Publish ve Workflow'lar

n8n'i bir MQTT broker'a bağlayın: credential ayarlayın, MQTT Trigger ve MQTT node'larını kullanın, JSON parse edin, alarmları yönlendirip komut publish edin.

Güncellendi · 8 dk okuma

n8n ile MQTT Otomasyonları: Trigger, Publish ve Workflow'lar

n8n, MQTT ile iki core node üzerinden konuşur: topic'lere abone olup gelen her mesaj için bir workflow başlatan MQTT Trigger ve workflow'un herhangi bir adımından mesaj publish eden MQTT node'u. Broker'ınızın host, port ve giriş bilgileriyle bir MQTT credential'ı ekleyin, bir trigger yerleştirin, workflow'u aktif edin; artık her sensör ölçümü Slack'e, e-postaya, bir veritabanına, bir HTTP API'ye veya tekrar bir cihaza gidebilir.

Bu eğitim iki gerçek workflow kuruyor — bir sıcaklık alarmı ve webhook'tan cihaza bir komut — ve her adımı ikinci bir MQTT istemcisiyle nasıl test edeceğinizi gösteriyor.

n8n bir MQTT sistemine nasıl oturur

n8n bir workflow otomasyon aracıdır, broker değildir. Broker'ınıza sıradan bir MQTT istemcisi olarak bağlanır:

Roln8n parçasıMQTT eylemi
Cihaz verisine tepki vermekMQTT Trigger node'uBir veya daha fazla topic filtresine SUBSCRIBE
Komut veya türetilmiş veri göndermekMQTT node'uBir topic'e PUBLISH
YapıştırıcıDiğer tüm node'lar (IF, Switch, HTTP Request, Code, Slack…)—

Yani MQTT istemcileri hakkında bildiğiniz her şey geçerlidir: her trigger benzersiz bir client ID'ye ihtiyaç duyar, QoS abonelik başına belirlenir ve n8n'in neyi okuyup yazabileceğine broker'ın ACL'leri karar verir. Node-RED kullanıyorsanız model benzerdir; karşılaştırma için Node-RED ve MQTT yazısına bakın. n8n'in gücü, MQTT node'larının yanında duran uzun SaaS entegrasyonu listesidir.

n8n'i yerelde çalıştırın

Denemenin en hızlı yolu resmi Docker imajıdır:

n8n'i http://localhost:5678 adresinde başlatın
docker volume create n8n_data
docker run -it --rm --name n8n \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n

http://localhost:5678 adresini açın, owner hesabını oluşturun ve yeni bir workflow başlatın. n8n Cloud da aynı şekilde çalışır; tek fark, broker'ın internetten erişilebilir olması gerektiğidir, çünkü MQTT bağlantısını dizüstü bilgisayarınız değil n8n'in sunucuları açar.

MQTT credential'ını oluşturun

Herhangi bir MQTT node'u ekleyin, Credential to connect with alanını açın ve Create new credential seçin. MQTT credential'ında şu önemli alanlar vardır:

AlanTCP testi için değerTLS için değer
Protocolmqttmqtts
Hostbroker.connectmq.combroker.connectmq.com
Port18838883
Username / Passwordbroker'ınızın kimlik bilgileribroker'ınızın kimlik bilgileri
Client IDboş bırakın veya benzersiz bir değer verinaynı
Clean Sessionaçıkaçık

Hızlı bir testin ötesindeki her şey için TLS (8883 üzerinde mqtts) kullanın: credential bir kez kaydedilir ve tüm node'lar tarafından yeniden kullanılır, dolayısıyla parolaları düz metin göndermek için hiçbir neden yoktur. n8n kaydederken bağlantıyı test eder; başarısız olursa hata metni genellikle broker'ın CONNACK reason code'udur. Bunu MQTT reason code aracında arayın.

Workflow 1: sıcaklık alarmı

İlk workflow sensör ölçümlerini dinler ve bir değer eşiği aştığında mesaj gönderir.

Adım 1 — MQTT Trigger. Topics alanını testmqtt/n8n/+/temperature yapın. Alan virgülle ayrılmış bir liste kabul eder ve + ile # wildcard'ları her zamanki gibi çalışır (filtrelerinizi topic matcher ile kontrol edin). Options altında payload'ın bir nesneye dönüşmesi için JSON Parse Body seçeneğini, sonraki adımlarda topic'e ihtiyacınız yoksa Only Message seçeneğini açın. Tek bir workflow birçok cihazı yönetiyorsa topic'i koruyun.

Seçenekler gösterildiği gibiyken bir mesaj şöyle bir item olarak gelir:

Trigger çıktısı (JSON Parse Body açık, Only Message kapalı)
{
  "topic": "testmqtt/n8n/greenhouse-1/temperature",
  "message": { "value": 31.4, "unit": "C", "ts": 1760700000 }
}

Adım 2 — IF node'u. Bir koşul ekleyin: {{ $json.message.value }} sayısı 30'dan büyük.

Adım 3 — Bildirim. true dalına bir Slack, Telegram, Discord veya Send Email node'u ekleyin. İşe yarar bir mesaj metni:

Bildirim metni (n8n ifadesi)
🌡 {{ $json.topic.split('/')[2] }} şu an {{ $json.message.value }} °{{ $json.message.unit }}

split('/')[2] cihaz ID'sini topic'ten çeker; tutarlı bir yapının işe yaramasının nedeni budur. Bkz. topic tasarımı en iyi uygulamaları.

Aktif etmeden önce test edin

Execute workflow'a (veya trigger üzerindeki Listen for test event'e) tıklayın. Trigger artık bir mesaj bekler. Terminalden ya da online MQTT istemcisinden bir ölçüm publish edin:

Test ölçümü gönderin
mosquitto_pub -h broker.connectmq.com -p 1883 \
  -t testmqtt/n8n/greenhouse-1/temperature \
  -m '{"value": 31.4, "unit": "C", "ts": 1760700000}'

Workflow bir kez çalışır ve her node'daki veriyi inceleyebilirsiniz. false dalının sessiz kaldığını doğrulamak için "value": 22 içeren ikinci bir mesaj publish edin.

Workflow 2: webhook'tan cihaz komutuna

Ters yön de en az o kadar yaygındır: MQTT dünyasının dışındaki bir şey (bir form, bir takvim, bir CRM olayı, başka bir API) bir cihazı açıp kapatmalıdır.

  1. Webhook node'u, metot POST, path lamp. Test URL'si http://localhost:5678/webhook-test/lamp gibi görünür.
  2. Paylaşılan bir gizli anahtar header'ını kontrol eden bir IF node'u; örneğin {{ $json.headers['x-api-key'] }} değerinin n8n'de sakladığınız değere eşit olması. İnternetteki herkesin cihazlarınıza publish etmesine izin vermeyin.
  3. Topic değeri testmqtt/n8n/lamp-1/set olan bir MQTT node'u. Send Input Data'yı kapatın ve Message'ı {{ $json.body.state }} yapın. Seçeneklerde QoS 1 seçin, anlık komutlar için Retain'i kapalı bırakın.

Send Input Data açıkken n8n giriş item'ının tamamını JSON olarak publish eder; iletmek için pratiktir ama ON veya OFF bekleyen bir cihaz için genellikle fazladır.

Komut topic'ini bir terminalde izleyin, webhook'u diğerinde çağırın:

Terminal 1 — n8n'in ne publish ettiğini izleyin
mosquitto_sub -h broker.connectmq.com -p 1883 -t 'testmqtt/n8n/+/set' -v
Terminal 2 — workflow'u tetikleyin
curl -X POST http://localhost:5678/webhook-test/lamp \
  -H 'Content-Type: application/json' \
  -H 'x-api-key: change-me' \
  -d '{"state": "ON"}'

Terminal 1, testmqtt/n8n/lamp-1/set ON yazdırmalıdır. Ters desen için — HTTP endpoint çağıran MQTT mesajları — MQTT'den webhook'a yazısına bakın.

Workflow'u aktif edin

Test çalıştırmaları yalnızca editör dinlerken çalışır. Mesajları kalıcı olarak işlemek için workflow'u kaydedin ve aktif edin (yayınlayın). Bundan sonra n8n aboneliği arka planda açık tutar ve her mesaj, execution listesinde inceleyebileceğiniz bir execution oluşturur.

Trafik gerçek olduğunda iki ayar önem kazanır:

  • Execution hacmi. Her mesaj bir execution'dır. Saniyede bir publish eden bir sensör günde 86.400 execution oluşturur; bu da geçmişi doldurur ve CPU harcar. Edge'de toplulaştırın, daha seyrek publish edin veya ham telemetri yerine bir "olaylar" topic'ine abone olun.
  • Sıralama. Trigger mesajları varsayılan olarak paralel işler. Sıra önemliyse (aynı cihazın durum değişiklikleri), mesajların birbiri ardına işlenmesi için trigger seçeneklerinde paralel işlemeyi kapatın.

Teslim garantileri ve yeniden başlatmalar

n8n bir istemcidir; dolayısıyla teslim garantileri, broker'ın o abonelik için verdiği garantilerdir:

  • n8n yeniden başlarken publish edilen QoS 0 mesajları kaybolur.
  • Kalıcı bir session ile QoS 1 (Clean Session kapalı ve sabit bir client ID), n8n kapalıyken broker'ın mesajları kuyruğa almasını ve yeniden bağlanınca teslim etmesini sağlar. Bu yalnızca session tutan bir broker'da çalışır; paylaşımlı test endpoint'i broker.connectmq.com offline session saklamaz, bu yüzden bunu kendi özel broker instance'ınızda deneyin.
  • Retained mesajlar, trigger abone olur olmaz teslim edilir; yani aktif edilen bir workflow, eşleşen her retained topic için bir kez tetiklenebilir. Durum topic'lerinde genellikle istenen budur, alarm topic'lerinde ise sürprizdir; bkz. retained mesajlar.

n8n'i birden fazla worker ile queue mode'da çalıştırıyorsanız trigger'lar yine ana instance'ta yaşar. Aynı aktif MQTT workflow'uyla birden fazla ana instance başlatmayın; aksi halde her mesaj birkaç kez işlenir.

Sorun giderme kontrol listesi

BelirtiOlası nedenÇözüm
Credential testi "Not authorized" ile başarısızKullanıcı adı/parola yanlış veya kullanıcının CONNECT yetkisi yokGirişi önce mosquitto_pub/mosquitto_sub ile doğrulayın
Trigger bağlanıyor ama hiç tetiklenmiyorTopic filtresi eşleşmiyor veya ACL aboneliği reddediyorOnline istemciden tam topic'e publish edin; ACL'leri kontrol edin
İfadeler undefined döndürüyorJSON Parse Body kapalı, payload stringSeçeneği açın veya bir Code node'unda parse edin
Workflow her mesajda iki kez tetikleniyorİki aktif workflow veya iki n8n instance'ı aboneKopyaları devre dışı bırakın; tek ana instance kullanın
n8n Cloud bağlanamıyorBroker yalnızca LAN'ınızdan erişilebilirPublic endpoint'i ve TLS'i olan bir broker kullanın

n8n topic'lerinizi tarayıcıda izleyin

n8n, bir servis yazmadan MQTT mesajlarını workflow'lara dönüştürür: bir trigger, birkaç node ve bir MQTT publish, alarm ve komut senaryolarının çoğunu karşılar. Her workflow'u aktif etmeden önce ikinci bir istemciyle test edin, n8n'e kısıtlı kendi broker kullanıcısını verin ve execution sayısı makul kalsın diye yüksek frekanslı telemetriyi workflow'ların dışında tutun.

Sıkça sorulan sorular

n8n'de yerleşik bir MQTT node'u var mı?

Evet. n8n iki core node ile gelir: bir veya daha fazla topic'e abone olup her mesajda bir workflow başlatan MQTT Trigger ve workflow içinden mesaj publish eden MQTT node'u. İkisi de aynı MQTT credential'ını kullanır.

n8n MQTT Trigger'ım neden sadece test ederken tetikleniyor?

Editördeki 'Listen for test event' yalnızca editör açıkken çalışır. Mesajları kalıcı olarak işlemek için workflow'u aktif etmeniz (yayınlamanız) gerekir. Yalnızca aktif bir workflow MQTT aboneliğini arka planda açık tutar.

n8n JSON MQTT payload'larını otomatik parse edebilir mi?

Evet. MQTT Trigger'da 'JSON Parse Body' seçeneğini açın; message alanı bir nesneye dönüşür ve {{ $json.message.temperature }} gibi ifadeler çalışır. Bu seçenek kapalıyken payload string olarak gelir.