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:
- Aktüatör başına maksimum çalışma süresi. Sisleyici, hiçbir
OFFgelmese bile örneğin beş dakika sonra kendini kapatır. Takılı kalan bir vana ürünü su altında bırakabilir. - 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.
- 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.
- Eylemden sonra durumu yayınlayın.
/statetopic'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. - Son vasiyet (last will). Eksik bir rölenin anında görünür olması için bir durum topic'inde retained
offlinevasiyetiyle 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
injectdüğü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.



