10. ünite / 10
Akıllı ev ve akıllı sera: kural motoru ve sistem mimarisi
EĞER … İSE … kurallarıyla seranın pencere, fan, ısıtıcı ve sulamasını yönet; histerezis, BEKLE ve çevrim dışı güvenli varsayılanlarla bitirme projesinin mimarisini kur.
Bu ünitenin sonunda
- EĞER/İSE/VE/BEKLE diliyle sera kuralları yazıp 24 saatlik benzetimde puanlamak
- Histerezis ve en kısa bekleme süresiyle röle anahtarlamasını azaltmak
- Cihaz üstü (yerel) kurallarla bulut kurallarını ayırmak ve çevrim dışı güvenli varsayılan tanımlamak
- Bitirme projesinin cihaz, broker, kural motoru ve pano mimarisini çizmek
Ders notları
Önceki ünitelerin hepsi burada birleşir: sensörler telemetri yayımlar, eyleyiciler komut alır, pano durumu gösterir. Eksik olan karar veren parçadır: kural motoru. Bu derste kurallar iki dilli küçük bir dille yazılır:
Kuralların anlamı
- Her dakika kurallar sırayla değerlendirilir; koşulu tutan kural eyleyiciyi ayarlar, aynı eyleyicide sonraki kural kazanır.
- Eyleyici yeni bir kural gelene kadar değerini korur. "33 üstünde aç" ve "29 altında kapat" iki kural birlikte histerezis oluşturur.
BEKLE n: o eyleyici son değişimden bu yana n dakika geçmeden yeniden değiştirilemez. Röleyi, kompresörü ve pompayı sık anahtarlamadan korur.- Koşullar
VEile birleşir:EĞER toprak < 35 VE saat >= 6 İSE sulama = 1gece sulamayı engeller.
Yerel mi, bulutta mı?
Isıtıcıyı kapatmak gibi güvenlik kuralları cihazda çalışmalıdır: Wi-Fi kopunca sera yanmamalı. Bulut kuralları (hava tahminine göre sulamayı ertelemek, birden çok seranın enerji bütçesi) daha esnektir ama gecikmeli ve bağlantıya bağımlıdır. İyi tasarım "yerel önce"dir: bulut kuralları güncellenebilir bir kural setini cihaza retained bir konuyla gönderir, cihaz doğrulayıp uygular. Bağlantı yoksa cihaz son geçerli kural setiyle, o da yoksa güvenli varsayılanlarla (ısıtıcı kapalı, pencere yarı açık) çalışır. Sensör arızasında (NaN ya da imkânsız değer) ısıtıcı asla açık kalmamalıdır.
Bitirme projesinin mimarisi
Akıllı sera dört katmandan oluşur: (1) ESP32 düğümleri: DHT22/BME280, LDR, toprak nemi, MOSFET ile fan ve pompa, servo ile pencere; (2) TLS'li MQTT broker ve ACL; (3) kural motoru: güvenlik kuralları cihazda, iyileştirme kuralları sunucuda; (4) pano: canlı grafik, gölge durumu, uyarılar. Kurallarını konfor yüzdesi, aşırı sıcak/soğuk dakika, anahtarlama sayısı ve enerjiyle puanla; bir sonraki derste sabit eşikler yerine öğrenilmiş bir anomali uyarısı kuracaksın.
Simülasyonlar
Akıllı sera: kural motoru
EĞER … İSE … kurallarıyla pencere, fan, ısıtıcı, sulama ve alarmı yönet. 24 saatlik sera gününü dış hava ve bulutlulukla benzet; konfor yüzdesi, aşırı sıcak/soğuk dakika, röle anahtarlama sayısı ve enerjiyle kurallarını puanla.
3B akıllı sera: cihazlar, broker ve MQTT paketleri
Seranın 24 saatini kural motoruyla oynat. Sensör düğümü her 10 dakikada sıcaklık yayımlar, eyleyici düğümü durum değiştirince kalıcı durum mesajı yollar; her paket broker'dan geçerek abonelerine uçar. Panodan elle komut gönder, pencere, fan, ısıtıcı ve sulamanın sahnede değiştiğini izle.
3B sahne yükleniyor…
Sürükle: döndür · iki parmak / tekerlek: yakınlaş · sağ tuş: kaydır
- telemetri
- komut
- durum (retained)
- 11:00
sera/01/sicaklik26.8 sensor → broker → actuator, dashboard - 10:50
sera/01/sicaklik26.2 sensor → broker → actuator, dashboard - 10:40
sera/01/sicaklik25.7 sensor → broker → actuator, dashboard - 10:30
sera/01/sicaklik25.1 sensor → broker → actuator, dashboard
Kod
struct Act { int pin; bool on; uint32_t lastChange; uint32_t holdMs; };
Act fan = { 26, false, 0, 5UL * 60000 }; // BEKLE 5 dk: röleyi koru
Act heater = { 27, false, 0, 10UL * 60000 };
bool set(Act& a, bool want) {
if (want == a.on) return false;
if (millis() - a.lastChange < a.holdMs) return false; // çok erken: değiştirme
a.on = want; a.lastChange = millis();
digitalWrite(a.pin, want);
return true;
}
void rules(float t, bool online) {
// Histerezis: 33 üstünde aç, 29 altında kapat; arada önceki durum kalır
if (t > 33) set(fan, true);
else if (t < 29) set(fan, false);
if (t < 14) set(heater, true);
else if (t > 17) set(heater, false);
if (isnan(t) || t > 45) set(heater, false); // sensör arızası: ısıtıcıyı asla açık bırakma
if (!online) { /* bulut yok: yerel kurallar çalışmaya devam eder */ }
}import json
OPS = {">": lambda a, b: a > b, "<": lambda a, b: a < b, ">=": lambda a, b: a >= b, "<=": lambda a, b: a <= b}
kurallar = [] # retained "sera/01/kurallar" konusundan gelir
def kurallari_al(msg):
global kurallar
yeni = json.loads(msg)
if all(r["op"] in OPS for r in yeni): # doğrula, sonra değiştir: bozuk kural seti çalışmayı durdurmaz
kurallar = yeni
def degerlendir(ortam, eyleyici):
for r in kurallar: # sırayla; aynı eyleyicide sonraki kazanır
if all(OPS[c["op"]](ortam[c["s"]], c["v"]) for c in r["kosul"]):
eyleyici[r["act"]] = r["val"]
return eyleyiciKendin dene
Kural motorunda varsayılan kuralları çalıştır ve konfor yüzdesini, fan anahtarlama sayısını ve enerjiyi not et. Fanın BEKLE süresini kaldır: anahtarlama sayısı ne oldu? Dış sıcaklığı düşürüp bulutluluğu artır ve ısıtıcı kurallarını konforu %90'ın üstüne çıkaracak, enerjiyi en az tutacak şekilde ayarla. Sözdizimi hatalı bir satır ekle ve hatanın satır numarasıyla gösterildiğini gör. Wokwi'de ESP32 + DHT22 + LED (fan) + servo (pencere) ile C++ kurallarını dene.
Sık yapılan hatalar
- Aynı eşikte açıp kapatmak (EĞER > 30 aç, EĞER < 30 kapat): değer 30 civarında gezinince röle titreşir.
- Güvenlik kuralını yalnız bulutta çalıştırmak: bağlantı kopunca ısıtıcı açık kalabilir.
- Kural sırasını önemsememek: aynı eyleyicide sonraki kural kazanır, genel kural özel kuralı ezebilir.
- Sensör NaN döndüğünde son kararı korumak: arızalı sensörle ısıtıcı saatlerce açık kalabilir.
- Yeni kural setini doğrulamadan uygulamak: tek bir bozuk satır tüm otomasyonu durdurabilir.
Yazılım mühendisliği bağlantısı
Kural motoru küçük bir alan özgü dildir (DSL): ayrıştırıcı, değerlendirici ve benzetici ayrı ve saf parçalardır.
- Ayrıştırıcıya hatalı girdiler için testler yaz: bilinmeyen sensör, eksik İSE, değer 0/1 dışında. Hata satır numarasıyla dönmeli.
- Benzetimi bir regresyon testi olarak kullan: kural setini değiştiren her commit "konfor ≥ %90, ısıtıcı anahtarlaması ≤ 6" gibi bir ölçütü geçmeli.
Kendini sına
"EĞER sicaklik > 33 İSE fan = 1" ve "EĞER sicaklik < 29 İSE fan = 0" kuralları varken sıcaklık 31 °C. Fan ne yapar?
BEKLE 10 olan ısıtıcı 08:00'de açıldı. Kural 08:04'te kapatmak istiyor. Ne olur?
Wi-Fi kopunca ısıtıcının güvenli durumu nasıl sağlanır?
Aynı dakikada iki kural pencereyi farklı değerlere ayarlıyor. Hangisi kazanır?
Bu üniteden sonra bitirme projesinde
- Kural motoru, testler ve demo: Cihaz üstü kurallar ve güvenli varsayılan; test raporu; 5 dakikalık demo videosu ve mimari çizimi.