IoT Otomasyon

MQTT ve Node-RED ile Sera Otomasyonu: Fanlar, Isıtma ve Sisleme

Bir serayı MQTT ile otomatikleştirin: sensörler iklim verilerini yayınlar, bir Node-RED akışı histerezis kullanarak ne zaman havalandırılacağına, ısıtılacağına veya sisleneceğine karar verir ve röle düğümleri yerel güvenlik önlemleriyle harekete geçer.

Sıcaklık ve nem sensörleri, bir egzoz fanı, bir ısıtıcı ve MQTT ile kontrol edilen sisleme nozullarından oluşan sera otomasyonu düzeneği
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Sera otomasyonu, havalandırma kapaklarını doğru anda açacak birine güvenmek yerine fanları, ısıtıcıları ve sislemeyi otomatik olarak açıp kapatarak sıcaklığı ve nemi bitkilerinizin ihtiyaç duyduğu aralıkta tutar. Bu eğitimde MQTT topic'lerini tasarlayacak, üç aktüatörü histerezis ve kilitlemelerle kontrol eden bir Node-RED akışı yazacak, eskimiş veriler için bir bekçi (watchdog) ekleyecek ve ağ çöktüğünde röle düğümlerini kendi başlarına güvenli hale getireceksiniz.

Mimari

Sistem, yalnızca bir MQTT broker üzerinden iletişim kuran üç parçadan oluşur:

 Climate sensor (ESP32 + SHT31/BME280)
        |  publishes telemetry every 30 s
        v
   MQTT broker  <---->  Node-RED (decision logic)
        ^                     |
        |  publishes /set     |
        +---------------------+
        |
 Relay node (ESP32 + 3 relays): fan, heater, mister
        publishes /state after acting

Algılama, mantık ve eyleme geçmeyi birbirinden ayırmanın gerçek faydaları vardır. Mantığa dokunmadan sensörü değiştirebilir, hiçbir şeyi yeniden yüklemeden ayar noktalarını telefondan değiştirebilir ve daha sonra bir pano veya veri kaydedici ekleyebilirsiniz; bunlar yalnızca bir abone daha olur. Broker'lar hakkında bilginizi tazelemeniz gerekiyorsa önce bir MQTT broker'ın ne yaptığını okuyun.

Sera Otomasyonu için Topic Tasarımı

Geliştirme sırasında herkese açık test broker'ını kullanın. g2w6n3 değerini kendi rastgele dizenizle değiştirin, çünkü herkese açık alan paylaşımlıdır ve herkes tarafından okunabilir.

Topic Yön Payload Retained
connectmq/demo/g2w6n3/greenhouse/climate sensörden herkese {"temp":27.4,"hum":58.2} evet
connectmq/demo/g2w6n3/greenhouse/setpoints telefon/panodan Node-RED'e {"heat_on":12,"vent_on":28,"mist_on":45} evet
connectmq/demo/g2w6n3/greenhouse/fan/set Node-RED'den röleye ON / OFF hayır
connectmq/demo/g2w6n3/greenhouse/heater/set Node-RED'den röleye ON / OFF hayır
connectmq/demo/g2w6n3/greenhouse/mister/set Node-RED'den röleye ON / OFF hayır
connectmq/demo/g2w6n3/greenhouse/<actuator>/state röleden herkese ON / OFF evet
connectmq/demo/g2w6n3/greenhouse/alarm Node-RED'den herkese {"type":"stale_sensor"} hayır

Ayar noktaları retained'dır; böylece Node-RED yeniden başladıktan hemen sonra güncel değerleri alır. Komutlar retained değildir; böylece yeniden başlayan bir röle eski bir talimatı tekrar uygulamaz.

Node-RED Akışını Oluşturma

Akışı aşağıdaki düğümlerle oluşturun. Node-RED'de yeniyseniz Node-RED MQTT eğitimi broker yapılandırmasının temellerini anlatır.

Düğüm Ayarlar
mqtt-broker yapılandırması Sunucu broker.connectmq.com, port 1883, client ID nodered-gh-g2w6n3, protokol MQTT 3.1.1
mqtt in "climate" Topic connectmq/demo/g2w6n3/greenhouse/climate, çıktı "a parsed JSON object"
mqtt in "setpoints" Topic connectmq/demo/g2w6n3/greenhouse/setpoints, çıktı "a parsed JSON object"
function "climate logic" Aşağıdaki kod, 1 çıkış, her iki mqtt in düğümünden bağlanır
mqtt out "actuators" Topic boş (msg.topic'ten alınır), QoS 1, retain false
inject "watchdog tick" Her 60 saniyede bir tekrarla
function "watchdog" Aşağıdaki kod, aynı mqtt out düğümüne bağlanır

İklim mantığı fonksiyonu

const BASE = "connectmq/demo/g2w6n3/greenhouse";

// Varsayılanlar; retained setpoints mesajıyla geçersiz kılınır
const sp = flow.get("sp") || { heat_on: 12, heat_off: 14, vent_on: 28, vent_off: 25, mist_on: 45, mist_off: 55, mist_max_temp: 35 };

if (msg.topic.endsWith("/setpoints")) {
    const p = msg.payload || {};
    if (p.heat_on !== undefined) { sp.heat_on = p.heat_on; sp.heat_off = p.heat_on + 2; }
    if (p.vent_on !== undefined) { sp.vent_on = p.vent_on; sp.vent_off = p.vent_on - 3; }
    if (p.mist_on !== undefined) { sp.mist_on = p.mist_on; sp.mist_off = p.mist_on + 10; }
    flow.set("sp", sp);
    node.status({ fill: "blue", shape: "ring", text: "setpoints " + JSON.stringify(p) });
    return null;
}

const t = Number(msg.payload.temp);
const h = Number(msg.payload.hum);
if (!Number.isFinite(t) || !Number.isFinite(h) || t < -20 || t > 60 || h < 0 || h > 100) {
    node.warn("Implausible reading ignored: " + JSON.stringify(msg.payload));
    return null;
}
flow.set("lastSeen", Date.now());

const st = flow.get("state") || { fan: "OFF", heater: "OFF", mister: "OFF" };
const next = Object.assign({}, st);

// Histerezisli ısıtma
if (t <= sp.heat_on) next.heater = "ON";
else if (t >= sp.heat_off) next.heater = "OFF";

// Histerezisli havalandırma
if (t >= sp.vent_on) next.fan = "ON";
else if (t <= sp.vent_off) next.fan = "OFF";

// Sisleme yalnızca buharlaşma için yeterince sıcakken ve ürünü dondurmayacakken
if (h <= sp.mist_on && t > 18 && t < sp.mist_max_temp) next.mister = "ON";
else if (h >= sp.mist_off || t <= 18) next.mister = "OFF";

// Kilitlemeler: asla aynı anda ısıtma ve havalandırma yok, ısıtırken asla sisleme yok
if (next.heater === "ON") { next.fan = "OFF"; next.mister = "OFF"; }

flow.set("state", next);

const out = [];
for (const a of ["fan", "heater", "mister"]) {
    if (next[a] !== st[a] || msg.forceSend) {
        out.push({ topic: `${BASE}/${a}/set`, payload: next[a] });
    }
}
node.status({ fill: "green", shape: "dot", text: `${t}°C ${h}% F:${next.fan} H:${next.heater} M:${next.mister}` });
return [out];

[out] döndürmek, dizideki her mesajı tek çıkış üzerinden sırayla mqtt out düğümüne gönderir. Komutlar yalnızca bir durum değiştiğinde gönderilir; bu da trafiği düşük, röle günlüklerini okunabilir tutar.

Bekçi (watchdog) fonksiyonu

const BASE = "connectmq/demo/g2w6n3/greenhouse";
const last = flow.get("lastSeen") || 0;
const ageMin = (Date.now() - last) / 60000;

if (last && ageMin > 5 && !flow.get("staleAlarm")) {
    flow.set("staleAlarm", true);
    flow.set("state", { fan: "OFF", heater: "OFF", mister: "OFF" });
    return [[
        { topic: `${BASE}/heater/set`, payload: "OFF" },
        { topic: `${BASE}/mister/set`, payload: "OFF" },
        { topic: `${BASE}/alarm`, payload: JSON.stringify({ type: "stale_sensor", minutes: Math.round(ageMin) }) }
    ]];
}
if (ageMin <= 5) flow.set("staleAlarm", false);
return null;

Sensör veri göndermeyi bırakırsa bekçi ısıtıcıyı ve sisleyiciyi kapatır, çünkü eski verilere göre hareket etmek hiçbir şey yapmamaktan daha kötüdür. Fana dokunulmaz; veri yokken kararı rölenin kendi güvenlik mekanizması (aşağıda) verir.

Akışı Test Etme

Sıcak ve kuru bir öğleden sonrayı, ardından soğuk bir geceyi simüle edin:

mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-g2w6n3 -r \
  -t 'connectmq/demo/g2w6n3/greenhouse/climate' -m '{"temp":30.2,"hum":40}'

mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-g2w6n3 -r \
  -t 'connectmq/demo/g2w6n3/greenhouse/climate' -m '{"temp":10.5,"hum":80}'

mosquitto_sub -h broker.connectmq.com -p 1883 -i mon-g2w6n3 \
  -t 'connectmq/demo/g2w6n3/greenhouse/+/set' -v

İlk mesaj fanı ve sisleyiciyi açmalı; ikincisi ikisini de kapatıp ısıtıcıyı açmalıdır. Ayar noktaları topic'ine {"vent_on":26} yayınlayarak ayar noktalarını canlı olarak değiştirin.

Röle Düğümünü Kendi Başına Güvenli Hale Getirme

Kararı Node-RED verir, ancak röle düğümü ağa asla körü körüne güvenmemelidir. Şu kuralları firmware'ine yerleştirin:

  1. Aktüatör başına maksimum çalışma süresi. Sisleyici, hiçbir OFF gelmese bile örneğin beş dakika sonra kendini kapatır. Takılı kalan bir vana ürünü su altında bırakabilir.
  2. Yerel aşırı sıcaklık kesmesi. Röle düğümünün kendi sıcaklık probu varsa, komutlardan bağımsız olarak kesin bir sınırın üzerinde ısıtıcıyı kapatır.
  3. Bağlantı kopunca güvenli durum. MQTT bir dakikadan uzun süre koptuğunda ısıtıcı ve sisleyici kapanır. Fanın açık mı kapalı mı kalacağına iklim koşullarınıza göre karar verin; sıcak bölgelerde havalandırma genellikle daha güvenli varsayılandır.
  4. Eylemden sonra durumu yayınlayın. /state topic'leri gerçekte ne olduğunu gösterir; bu da Node-RED'in ve panoların komutları yok sayan bir röleyi tespit etmesini sağlar.
  5. Son vasiyet (last will). Eksik bir rölenin anında görünür olması için bir durum topic'inde retained offline vasiyetiyle bağlanın.

Röle bağlantıları ve komut topic'lerine abone olan bir ESP32 sketch'i için ESP32 röle MQTT eğitimine bakın. Şebeke voltajlı ısıtıcılar ve fanlar, yetkin biri tarafından kurulan uygun değerli kontaktörler üzerinden anahtarlanmalıdır.

İnce Ayar İpuçları

  • 2 ile 3 °C'lik histerezis aralıkları, röleleri ve motorları yıpratan kısa döngüleri önler.
  • Sensör yerleşimi sensör doğruluğundan daha önemlidir: sensörü doğrudan güneşten koruyun, bitki yüksekliğine monte edin ve hava akışı sağlayın.
  • Gece ve gündüz ayar noktaları kolayca eklenebilir: gün doğumu ve gün batımında tetiklenen bir inject düğümü yeni retained ayar noktaları yayınlayabilir.
  • Her şeyi kaydedin. greenhouse/# topic'ine abone olan bir Node-RED akışı veya Telegraf örneği, bir sezon boyunca ayar noktalarını iyileştirmeniz için gereken geçmişi sağlar.

Tüm bir çiftlik genelinde sensörler, bağlantı ve topic tasarımının büyük resmi için akıllı tarım IoT rehberini okuyun ve sulama için bu serayı otomatik sulama sistemi ile birleştirin.

Serayı Uzaktan İzleme

Otomasyon, ancak ne yaptığını görebiliyorsanız güvenilirdir. İhtiyaçların çoğunu üç görünüm karşılar. Sıcaklık ve nem göstergeleri, aktüatör /state topic'lerini gösteren anahtarlar ve yeni ayar noktaları yayınlayan kaydırıcılar içeren bir Node-RED Dashboard sayfası, üreticilere telefonda basit bir kontrol paneli sunar. InfluxDB'ye yazan Telegraf gibi bir geçmiş kaydedici (historian), bu haftanın gecelerini geçen haftanınkilerle karşılaştırmanızı ve eskisinden daha uzun çalışan bir ısıtıcıyı fark etmenizi sağlar. Broker tarafındaki canlı bir topic görünümü ise her komut ve durum mesajını gerçekleştiği anda gösterir.

Broker ConnectMQ olduğunda, portalın canlı topic gezgini ve panosu bu son görünümü hiçbir şey kurmadan sağlar; tarayıcı içi MQTT client'ı da seradaki bir dizüstü bilgisayardan test amaçlı bir ayar noktası yayınlamak için kullanışlıdır. Hangi aracı kullanırsanız kullanın, /set ile /state değerlerini düzenli olarak karşılaştırın: hiç onaylanmayan bir komut, arızalanan bir röleye, gevşek bir kabloya veya Wi-Fi bağlantısını kaybetmiş bir düğüme işaret eder.

Üretime Geçiş

Mantık çalıştıktan sonra herkese açık test alanından çıkın. Özel bir broker oluşturun, mqtt-broker düğümünü TLS etkin olarak 8883 portuna geçirin ve size verilen kullanıcı adını, parolayı ve client ID'yi girin. Her cihaz kendi kimlik bilgilerini alır. Tam yönetilen bir MQTT hizmeti, seradaki bilgisayar çalışmadığında bile broker'ı çalışır durumda tutar ve iklimi her yerden kontrol etmenizi sağlar. IoT otomasyon rehberi, bu modelin evlere ve binalara nasıl genişlediğini gösterir.

Seranızı ConnectMQ Üzerinde Çalıştırın

ConnectMQ, seranıza TLS'li özel bir broker, komutları ve durumları izlemek için canlı bir topic gezgini ve don veya aşırı ısınmaya karşı yedek alarm olarak eşik uyarı kuralları sunar. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun ve Node-RED ile ESP32 düğümlerinizi ona yönlendirin.

Sık Sorulan Sorular

Sera otomasyonu internet olmadan çalışabilir mi?

Evet, broker ve Node-RED yerel ağdaysa. Bulut broker ile uzaktan erişim kazanırsınız; bu nedenle kritik güvenlik önlemlerini röle firmware'ine koyun ki sera bir kesinti sırasında güvende kalsın.

Sera için en iyi sıcaklık sensörü hangisidir?

SHT31 veya SHT4x yüksek nemle DHT22'den daha iyi başa çıkar. Hangisini seçerseniz seçin, havalandırmalı bir radyasyon kalkanıyla doğrudan güneşten koruyun.

Fanım neden sürekli açılıp kapanıyor?

Açma ve kapama eşikleri arasındaki fark çok küçüktür ya da sensör fanın hava akışında durmaktadır. Histerezisi genişletin ve sensörün yerini değiştirin.

Kontrol kararlarını Node-RED mi yoksa ESP32 mi vermeli?

Esnek mantık ve ayar noktaları için Node-RED'i kullanın; bağlantı kesilirse aktüatörlerin güvenli duruma geçmesi için basit güvenlik sınırlarını ESP32'de tutun.

İlgili yazılar

Zigbee2MQTT Kurulum Rehberi: Koordinatörden Panoya

Zigbee2MQTT'yi Docker ile kurun, koordinatörü ve MQTT bağlantısını yapılandırın, cihazları eşleştirip yeniden adlandırın, onları MQTT üzerinden kontrol edin ve durumlarını bir panoda görüntüleyin; önce ücretsiz herkese açık bir broker'da test edin.

7 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.