Okullar için Robotik ve Mühendislik · anaokulundan liseye

8. ünite / 8

Sıcaklık tahmini ve anomali uyarısı: bitirme projesine hazırlık

Tahmin artığını eğitimdeki dağılımla z-skoruna çevir; histerezis, ardışık örnek ve bekleme süresiyle uyarı üret. 5. gündeki ısıtıcı arızasını yakala, yanlış alarmı az tut, uyarıyı MQTT ile gönder.

Bu ünitenin sonunda

  • Tahmin artığından z-skoru hesaplayıp bir anomali puanına çevirmek
  • Histerezisli, ardışık örnekli ve beklemeli bir uyarı durum makinesi kurmak
  • Bir uyarı sistemini yakalama, gecikme ve yanlış alarm sayısıyla değerlendirmek
  • Uç hattı (temizle, özellik, tahmin, uyarı) cihazda ve MQTT ile uçtan uca bağlamak

Ders notları

Şimdiye kadar "bir saat sonra kaç derece olacak?" diye sorduk. Bu ünitede soruyu tersine çeviriyoruz: gerçekleşen değer, beklediğimden ne kadar farklı? İyi bir tahmin modeli, normal davranışın ölçüsüdür; modelin açıklayamadığı sapma ise bir şeylerin ters gittiğinin işaretidir.

Hat

  • Temizle: Hampel süzgeciyle sıçramaları sil, doğrusal ara değerle boşlukları doldur (2. ünite).
  • Özellik ve tahmin: aynı özellik tablosu, ilk dört gün (arızasız) ile eğitilmiş doğrusal model (5–6. üniteler).
  • Artık: r = gerçek − tahmin. Eğitim dönemindeki artıkların ortalaması μ ve sapması σ hesaplanır.
  • Puan: z = (r − μ) / σ. Normal günlerde |z| çoğunlukla 2'nin altındadır.
z(t) = (x(t) − x̂(t) − μ) / σ    σ: eğitim artıklarının sapması

Puanı uyarıya çevirmek

Tek bir eşik iki sorun çıkarır: eşiğin çevresinde salınan puan uyarıyı açıp kapatıp durur, tek bir gürültülü örnek de alarm çaldırır. Üç önlem:

  • Histerezis: açma eşiği 3, kapama eşiği 1,5. Uyarı bir kez açılınca puan iyice düşmeden kapanmaz.
  • Ardışık örnek: eşik en az 2 örnek art arda aşılmalı; tek sıçrama yetmez.
  • Bekleme: bir uyarıdan sonra 3 saat yeni bildirim gönderilmez; telefonu susturan kullanıcı sistemi kapatır.

Değerlendirme

Veri setinde 5. günün 13:00–19:00 arası takılı kalan bir ısıtıcı vardır (ariza = 1). Bir uyarı sistemini üç sayıyla ölçeriz: arıza yakalandı mı, arıza başladıktan kaç dakika sonra (gecikme) ve arıza penceresi dışında kaç yanlış alarm çaldı. Bunlar birbirine karşı çalışır: eşiği düşürmek gecikmeyi kısaltır ama yanlış alarmı artırır. Ufuk da önemlidir: 30 dakikalık tahminde rampa daha erken sezilir, 10 dakikalıkta model sapmaya hızla uyar ve geç fark eder.

Uyarı nereye gider?

Cihaz her örnekte puanı panoya, uyarıyı ise ayrı bir konuya retained olarak yayımlar: sonradan bağlanan bir telefon son uyarıyı hemen görür. IoT dersindeki MQTT broker'ı, konu düzeni ve son vasiyet aynen kullanılır; bitirme projesinde bu hattı uçtan uca kuracaksın.

Simülasyonlar

Sıcaklık tahmini ve anomali uyarısı

Model ilk dört günde (arızasız) eğitilir, sonra her örnekte tahmin artığının z-skoru hesaplanır. Açma ve kapama eşiği (histerezis), ardışık örnek sayısı ve bekleme süresiyle uyarıyı ayarla: 5. gündeki ısıtıcı arızasını yakala, yanlış alarmı az tut.

Gerçek ve tahmin sıcaklık (1–4. günlerde eğitildi)1216.821.626.431.20.061.452.834.225.616.99gün°C
Artık z-skoru, eşikler ve uyarılar (halkalar)-8-327120.061.452.834.225.616.99açkapagün
Isıtıcı arızası 50 dk sonra YAKALANDI · 2 yanlış alarm · toplam 4 uyarı · eğitim artığı σ = 0,388 °C

3B sera: ölçüm, tahmin ve anomali

Yedi günlük sera verisini 3B serada oynat. Yatakların rengi sıcaklığı, direkteki etiket gerçek ve tahmin değerini, öndeki sütunlar son iki saatin tahmin artığını gösterir. 5. günde ısıtıcı takılınca artık büyür, fener sarıdan kırmızıya döner.

3B sahne yükleniyor…

Sürükle: döndür · iki parmak / tekerlek: yakınlaş · sağ tuş: kaydır

5. gün 08:00 · gerçek 19,15 °C, tahmin (30 dk önce) 18,72 °C, z = 1,10 Durum: normal
7 günde uyarılar: 3. gün 08:30, 4. gün 08:30, 5. gün 13:50, 5. gün 19:10

Kod

alarm.h: histerezisli ve beklemeli uyarı durum makinesi (C++)
struct Alarm {
  float on = 3.0f, off = 1.5f;         // açma eşiği > kapama eşiği
  uint8_t minRun = 2;                  // art arda kaç örnek
  uint16_t cooldown = 18;              // 18 x 10 dk = 3 saat
  bool active = false;
  uint8_t run = 0;
  int32_t last = -100000, k = 0;

  // true: yeni bir uyarı gönderilmeli
  bool step(float z) {
    float a = fabsf(z);
    bool fire = false;
    if (!active) {
      run = (a >= on) ? run + 1 : 0;
      if (run >= minRun) {
        active = true;
        if (k - last >= cooldown) { fire = true; last = k; }
      }
    } else if (a < off) {
      active = false; run = 0;
    }
    k++;
    return fire;
  }
};
alert_mqtt.ino: uyarıyı MQTT ile yayımla (ESP32, PubSubClient)
#include <WiFi.h>
#include <PubSubClient.h>
WiFiClient net;
PubSubClient mqtt(net);
Alarm alarm;                           // alarm.h

void onSample(float actual, float forecast, float mu, float sd) {
  float z = (actual - forecast - mu) / sd;   // eğitim artıklarıyla ölçeklenmiş
  char msg[96];
  snprintf(msg, sizeof msg, "{\"z\":%.2f,\"t\":%.2f,\"pred\":%.2f}", z, actual, forecast);
  mqtt.publish("sera/01/anomali/z", msg);    // her örnek: pano için
  if (alarm.step(z)) {
    mqtt.publish("sera/01/uyari", msg, true);  // retained: yeni abone son uyarıyı görür
  }
  mqtt.publish("sera/01/uyari/durum", alarm.active ? "1" : "0", true);
}
Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide

Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.

anomali.pypython

Çıktı

Çıktı burada görünecek.

Kendin dene

Simülasyonda varsayılan ayarlarla 5. gündeki ısıtıcı arızasının yakalandığını ve gecikmeyi not et. Açma eşiğini 2'ye indir: kaç yanlış alarm çıktı? Ardışık örnek sayısını 1, 2 ve 4 yaparak gecikme ile yanlış alarm arasındaki dengeyi yaz. Bekleme süresini 0 yapınca aynı olay için kaç bildirim geliyor? Sıfır yanlış alarm ve en kısa gecikmeyi veren ayarı bul, sonra Python kodunu çalıştırıp aynı sonucu CSV üzerinde doğrula.

Sık yapılan hatalar

  • σ'yı arızalı dönemi de içeren tüm veriden hesaplamak: arıza σ'yı büyütür ve kendi uyarısını bastırır.
  • Artığı tahminin yapıldığı satıra yazmak: artık h adım sonraki gerçek değere aittir, zamanı kaydırmak gerekir.
  • Açma ve kapama eşiğini aynı yapmak: eşik çevresinde salınan puan uyarıyı sürekli açıp kapatır.
  • Bekleme süresi koymamak: tek bir olay için onlarca bildirim gelir ve kullanıcı uyarıları kapatır.

Yazılım mühendisliği bağlantısı

Uyarı sistemi bir durum makinesidir; durum makineleri tablo testleriyle sınanır.

  • Elle yazılmış kısa puan dizileriyle test yaz: "tek sıçrama uyarı açmaz", "iki ardışık örnek açar", "bekleme içinde ikinci bildirim yok".
  • Uyarıyı gönderen kod ile karar veren kodu ayır; karar saf fonksiyon olsun, MQTT yalnız bir çıkış.
  • Sahadaki yanlış alarmları etiketleyip veri setine geri ekle; eşikler sürüm numarasıyla değişsin.

Kendini sına

  1. Artığın z-skoru hangi σ ile hesaplanmalıdır?

  2. Histerezis (açma 3, kapama 1,5) neyi önler?

  3. Açma eşiğini 3'ten 2'ye düşürmenin olası etkisi nedir?

  4. Uyarıyı MQTT'de retained bayrağıyla yayımlamak ne sağlar?

Bu üniteden sonra bitirme projesinde

  • Uyarı, testler ve demo: Histerezisli uyarı, değerlendirme (gecikme, yanlış alarm), test raporu ve 5 dakikalık demo.

Parçalar ve ilgili sayfalar

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç