BOCU BC-01, tarımsal sulamada kullanılan 3 fazlı dalgıç ve dinamo pompaları uzaktan izleyen, koruyan ve kontrol eden bir cihazdır. Koruma kararı cihazın kendisindedir; sunucu koruma kesmesi yapmaz — konfigürasyonun kaynağı, kayıt tutucusu ve kullanıcı arayüzüdür. Bu sayfadaki demo, cihazla sunucu arasındaki gerçek MQTT protokolünü birebir uygular.
Aşağıdaki telefon uygulamayı, yanındaki günlük ise telefonla cihaz arasında gerçekten akan MQTT trafiğini gösterir. Payload'lar protokol sözleşmesindeki birebir formattır: akım desiamper, gerilim volt, zaman UTC epoch saniye. Demo hızlandırılmıştır — telemetri 60 sn yerine 2 sn'de bir, ACK zaman aşımı 90 sn yerine 8 sn'de dolar.
simülatörün gerçek senaryolarıyla aynı adlar
b/{id}/t · e · s · c · a · g
uygulama satır yazar, köprü imzalar
commands
tablosuna queued satırı yazar. HMAC anahtarı yalnızca köprüde durur,
telefona hiç inmez — çalınan bir oturumla pompa çalıştırılamaz. ACK 90 saniye
beklenir, gelmezse komut timeout olur ve otomatik tekrar
gönderilmez: sessizce tekrarlanan bir röle komutu sahada tehlikelidir.
BC-01 (Arduino Nano + SIM7020E NB-IoT) │ MQTT / Turkcell M2M ▼ EMQX Broker ──────► ingest worker ──► Postgres (Supabase) + bölümlenmiş telemetri ▲ │ │ └────────► notifier worker ──► Expo Push (FCM / APNs) │ ├─ commander worker ◄── commands tablosu ◄──── RN Expo uygulaması │ │ └─────────── MQTT over WSS (canlı veri) ─────────────┘
Cihaz tarafı Arduino Nano: 2 KB RAM, 32 KB flash, RTC yok, yedek besleme yok. Payload'lar bu yüzden tek harfli alanlarla yazıldı ve ölçüler tam sayı tutuluyor.
desiamper — 52 = 5,2 Atime komutu, tv=0 iken zamanlayıcı çalışmazSunucu hiçbir koşulda röle kesmez. Şebeke veya kapsama gittiğinde motorun korumasız kalmaması ürünün ana vaadi; bu yüzden karar zinciri buluta bağlanmadı.
latch_reset isterrelay:1 cihazda reddedilirNOLOAD)RLS satırları filtreler, sütunları değil. Kendi cihazını görebilen kullanıcı aynı satırdaki imza anahtarını da okuyabiliyordu; ilk RLS test koşusunda iki test bunu yakaladı.
hmac_key, secret_hash, claim_code → device_secretsservice_roleCihaz firmware'ini harici bir ekip yazıyor. Entegrasyon gününde "kimin hatası" tartışmasını bitirmek için protokol tek bir dokümana yazıldı, simülatör de sunucuyla aynı protokol modülünü kullanıyor: simülatörün yaptığı şey, tanımın kendisi.
| Topic | Yön | QoS | Retained | İçerik |
|---|---|---|---|---|
b/{id}/t | cihaz → sunucu | 0 | hayır | Telemetri, 60 sn |
b/{id}/e | cihaz → sunucu | 1 | hayır | Alarm / olay, seq ile tekrar elenir |
b/{id}/s | cihaz → sunucu | 1 | evet | Durum özeti + LWT ({"o":0}) |
b/{id}/c | sunucu → cihaz | 1 | hayır | HMAC imzalı komut |
b/{id}/a | cihaz → sunucu | 1 | hayır | Komut ACK'i |
b/{id}/g | sunucu → cihaz | 1 | evet | Konfigürasyon, cv sürümlü |
{id} ağacına yazabilir. Mobil istemci JWT ile
bağlanır, yetkili olduğu cihazların t/e/s/a topic'lerini yalnızca okur —
telefondan hiçbir şeye yazılamaz.
Proje kapalı test aşamasında: sunucu tarafı bir sunucuda konteyner olarak 7/24 çalışıyor, mobil uygulama kapalı teste dağıtıldı ve bir cihaz sahada gerçek bir üç fazlı pompaya bağlı. Her fazın kendi kabul kriterleri var; kriterler geçmeden sonraki faza geçilmiyor.
| Katman | Durum |
|---|---|
| Protokol + simülatör | Tamam. Protokol tek bir modülde tanımlı; sahte cihaz 14 senaryo koşuyor (overcurrent, dry_run, phase_loss, no_ack, bad_hmac, offline_queue ve diğerleri). Bu sayfadaki demo bunlardan altısını tarayıcıda canlandırır. Ayrıca bir kabul aracı gerçek cihazı dinleyip 25 protokol maddesini tek tek derecelendiriyor. |
| Veritabanı + yetkilendirme | Supabase üzerinde canlı. Cihaz sahiplenme, cihaz paylaşımı, hesap silme, bölümlenmiş telemetri, konfigürasyon/zamanlayıcı ve abonelik şeması uygulandı. RLS politikaları 53 testle korunuyor. |
| Sunucu servisleri | Beş konteyner ayakta: EMQX, Redis, ingest, komutçu, bildirim. Yanlarında bir izleyici var — sağlıklıyken susuyor, yalnızca müdahale gerektireni bildiriyor ve aynı sebebi saat içinde tekrarlamıyor. |
| Komut yolu | Tamam. İmzalama, ACK takibi, 90 saniyelik zaman aşımı, retained konfigürasyon yayını ve saat senkronu. Cihaz başına aynı anda tek röle komutu tutuluyor; yenisi gelince eskisi bekletilmeden iptal ediliyor — geç teslim edilen bir "aç" komutu boş tarlada pompayı kaldırır. |
| Bildirim | Uçtan uca doğrulandı. FCM kurulu, cihaz jetonu kayıtlı; saha testinde 21 bildirim telefona düştü. |
| Mobil uygulama | 15 ekran, 5 sekmeli navigasyon: canlı ölçüm, cihaz listesi, alarmlar, grafikler, olay geçmişi, haftalık zamanlayıcı, cihaz ayarları, cihaz paylaşımı ve hesap. Giriş e-posta, Google veya Apple ile; parola sıfırlama ve hesap silme dahil. |
| Test | 237 test: RLS 53, protokol 39, komutçu 38, ingest 32, bildirim 30, protokol uyumluluğu 20, sahiplenme 9, provisioning 7, simülatör 7, sağlık 2. ruff + mypy --strict temiz. |
5 Eylül 2026 — ilk saha testi. O güne kadar her şey tezgâhta, ısıtıcı yüküyle denenmişti. Cihaz tarlaya götürülüp gerçek bir üç fazlı pompaya bağlandı; korumaların hepsi gerçek yükte tetiklendi. Tezgâhta günlerce sıfır okuyan gerilim ölçümü de burada kapandı — sahada üç faz da okudu.
| Kanıtlanan | Ölçüm |
|---|---|
| Üç faz gerilim + akım | 240 / 240 / 239 V, 31 A |
| Uzaktan aç / kapat | Motor komutu izledi; kalkış akımı 24.3 → 31.1 A yakalandı |
| Aşırı akım koruması | OC — 30.6 A, limit 6.9 A: kesti ve kilitledi |
| Düşük akım koruması | UC — 0.1 A, limit 8.0 A: kesti |
| Faz kaybı | PL — R fazı, alan seti şartnameye tam uygun |
| Çalıştırma reddi | NOSTART — 241 V, limit 240: çalıştırmadı, kilitlemedi |
| Bildirim zinciri | 21 bildirim telefona düştü |
| Komut başarısı | 64 komut onaylandı (%77); kaybolan komut yok, düşenlerin sebebi saat gecikmesi |
Monorepo, docker-compose (EMQX, Redis, Caddy), .env.example, ruff/mypy/pytest, Expo projesi, CI.
Protokol modülü (encode/decode, HMAC, birim dönüşümleri), sahte cihaz simülatörü, firmware ekibine verilen protocol.md.
Şema, RLS, kimlik doğrulama, cihaz sahiplenme (QR/claim kodu) ve üretim provisioning script'i. Mimari burada Supabase'e taşındı: auth ve CRUD hazır alındı, kendi servisimiz "köprü" boyutuna indi.
Ingest worker, telemetri doğrulama, seq tabanlı tekrar eleme, aylık bölümlenmiş telemetri tablosu.
Komut yolu ve konfigürasyon senkronu: imzalama, ACK, zaman aşımı, pending/applied/failed durumları, saat senkronu.
Bildirim worker'ı: FCM push, alarm cooldown'ı, normale dönüş bildirimi, LINK_LOST gecikmesi. Saha testinde uçtan uca doğrulandı.
Mobil temel: giriş, cihaz listesi, dashboard, canlı veri, röle kontrolü, kilit akışı, QR ile cihaz ekleme.
Mobil ayarlar, haftalık zamanlayıcı, grafikler, alarm ve olay listesi, cihaz paylaşımı, hesap silme.
Kapalı test ve sertleştirme: rate limit, metrik, yedekleme, yük testi, mağaza hazırlığı. Uygulama kapalı test dağıtımında, sistem sahada gerçek bir pompayla çalışıyor.
Cihazda yedek besleme yok. Süperkapasitör olmadan "elektrik kesildi" (PF) mesajı üretilemez; sunucu bu durumda yalnızca LINK_LOST diyebilir, yani şebeke kesintisi ile kapsama sorunu ayırt edilemez. Protokol iki durumu da destekliyor, karar donanım tarafında.
Uygulamanın gönderebileceği en ağır mesaj bu — kişiden tarlaya gidip şalteri indirmesini ister. Cihaz değerlendirmeyi röleyi açtıktan hemen sonra yaptığı için kaçak akımda da tetikleniyordu. Sunucu artık ölçümüyle çelişen alarmı telefona taşımıyor; kalıcı çözüm, kararın kesmeden birkaç saniye sonra ve üst üste birkaç örnekle verilmesi.
Saha kurulumunda sinyal sınırda ölçüldü (CSQ 2–8). Koruma bundan etkilenmiyor — karar cihazın kendisinde, internet gitse de motor korunur — ama uzaktan kontrolün güvenilir olması için antenin metal panonun dışına alınması gerekiyor.