Fridge Alert Bot
Restoran buzdolabı fazla ısındığında Telegram'dan uyarı — biri sadece kapıyı açtığında ise sessizlik.
- Rol
- Kişisel proje — tasarım, kod, testler
- Yıl
- 2026
- Kategori
- Botlar · Altyapı
- Teknolojiler
- Python 3.12, FastAPI, aiogram 3, SQLite

Sorun
Gece ısınan bir buzdolabı, sabah bozulmuş yiyecek demektir. Sıcaklık kaydındaki bir boşluk, hijyen denetiminde sorun demektir. Personel termometrelere günde birkaç kez bakar ve arızaların çoğunu kaçırır.
Ucuz sıcaklık sensörleri var. Eksik olan, onları izleyip doğru anda bir insanı çağıran şeydir — hem de biri kapıyı her açtığında boşuna alarm vermeden. Steady Control'de otel ve restoranlardaki buzdolabı sıcaklık sensörleriyle çalışıyorum; bu yüzden birini ne zaman uyandırmak gerektiğine karar veren kısmı geliştirdim.
Çözüm
Sensörler ölçümleri bir HTTP API'ye gönderir. Küçük bir durum makinesi her ölçümün ne anlama geldiğine karar verir:
- Uyarı gelmeden önce buzdolabının sınırın üzerinde 5 dakika kalması gerekir. Bir dakika açık kalan kapı asla uyarı vermez.
- Her olay için tek uyarı, ardından süre ve en yüksek sıcaklıkla birlikte "normale döndü" mesajı.
- Normale dönmek için sıcaklığın sınırın 0,5 °C altına inmesi gerekir; böylece sınırda gidip gelen bir buzdolabı sohbeti mesaja boğmaz.
- Çevrimdışı kalmış bir sensörden gelen geç veya tekrarlanan ölçümler geçmişe yazılır ama durumu geri almaz. 15 dakikadan eski olaylar kaydedilir ama duyurulmaz.
Telegram'da mutfak ekibi /status, /history <sensor> (PNG grafik), /setlimit ve /report
komutlarını kullanır; her sabah günlük özet gelir.
Demo
Ekran görüntüleri

Teknolojiler
- Python 3.12
- FastAPI
- aiogram 3
- SQLite
- matplotlib
- pytest
- Docker
Tip ipuçlarıyla Python 3.12, API için FastAPI, bot için aiogram 3, depolama için SQLite ve grafikler için matplotlib. API, bot ve rapor zamanlayıcısı tek bir asyncio sürecinde çalışır ve aynı servis nesnesini paylaşır; bu yüzden bir buzdolabının durumu hakkında asla farklı düşünmezler.
Öne çıkan kod
Uyarı kuralı saf bir fonksiyondur: veritabanı yok, Telegram yok, sadece "durum + ölçüm → yeni durum ve belki bir olay". Bu sayede her uç durum üç satırlık bir test olur.
def evaluate(
current: AlertState,
*,
sensor_id: str,
temperature: float,
at: datetime,
limit: float,
rules: AlertRules,
) -> tuple[AlertState, AlertEvent | None]:
"""Return the next state and, if something worth telling people happened, an event."""
above = temperature > limit
if current.state is SensorState.OK:
if above:
return AlertState(SensorState.PENDING, at, temperature), None
return current, None
started = current.breach_started_at
peak = (
temperature
if current.peak_temperature is None
else max(current.peak_temperature, temperature)
)
if current.state is SensorState.PENDING:
if not above:
return AlertState(), None
if at - started >= rules.delay:
event = AlertEvent(EventKind.ALERT, sensor_id, temperature, limit, started, peak, at)
return AlertState(SensorState.ALERT, started, peak), event
return replace(current, peak_temperature=peak), None
# ALERT
if temperature <= limit - rules.hysteresis:
event = AlertEvent(EventKind.RECOVERED, sensor_id, temperature, limit, started, peak, at)
return AlertState(), event
return replace(current, peak_temperature=peak), NoneBulduğum ve düzelttiğim hata
Simülatör sıradan kapı açılmalarında yanlış alarm veriyordu
Ne bozuldu
Bir test, simüle edilmiş bir günlük kapı açılmalarını gerçek uyarı kurallarından geçirir. Test başarısız oldu: tek bir ekipman arızası olmadan 18 uyarı ve normale dönüş mesajı. 30 farklı rastgele tohumda demo günde 8,2 yanlış alarm üretti. Sürekli boşuna alarm veren bir demo, ürünü bozuk gösterir.
Asıl neden
Simülatör açık kapıyı "sensör oda sıcaklığına (24 °C) doğru gider" diye modelliyordu. Bu, çıplak bir hava sensörünün davranışıdır. Buzdolabının içindeki sensör yiyeceklerin arasında durur ve karışık havayı ölçer. Arka arkaya iki kapı açılması, ölçümü uyarı gecikmesinden daha uzun süre 5 °C'nin üzerinde tutuyordu.
Çözüm
Artık açık kapı hedefi ayar değerinin birkaç derece üzerine çıkarıyor ve kompresör daha hızlı toparlıyor. Aynı tohumlarda yanlış alarmlar 8,2'den günde 0,13'e düştü. Belirsiz test iki kesin teste dönüştü: tek bir kapı açılması asla uyarı vermemeli, yoğun bir hafta en fazla iki uyarı verebilir.
door_tau_s: float = 900.0
cool_tau_s: float = 300.0
elif self.mode is Mode.DOOR_OPEN:
target, tau = p.ambient_c, p.door_tau_sdoor_delta_c: float = 5.0
door_tau_s: float = 300.0
cool_tau_s: float = 180.0
elif self.mode is Mode.DOOR_OPEN:
target, tau = p.setpoint_c + p.door_delta_c, p.door_tau_sSonuç
- 83 otomatik test ve sıfır linter uyarısı; GitHub Actions her push'ta bunları çalıştırır.
- Donanım olmadan baştan sona çalışır: simülatör kapı açılmaları ve kompresör arızaları üretir; bot token'ı yoksa uyarılar konsola yazılır.
- Canlı bir demo çalıştırmasında zorla oluşturulan kompresör arızası tam olarak bir uyarı verdi, kapı açılmaları ise hiç vermedi.