Bina otomasyonu · IoT
Cihaz sözleşmesinin bir kez tanımlandığı bir bina otomasyon platformu
KNX donanımı üreten bir firma, hem kendi cihazlarını hem de herhangi bir üçüncü taraf KNX cihazını yönetecek bir yazılım platformuna ihtiyaç duyuyordu. Mimariyi tanımladık; mantık motorunu, görsel otomasyon editörünü ve tablet istemcisini kurduk.
- Dönem
- 2025 – günümüz
- Teslim ettiğimiz
- Sistem mimarisi, mantık yürütme motoru, paylaşımlı tip kütüphanesi, yönetim paneli, tablet istemcisi
- Çalışma ortamı
- Müşteriyle birlikte iki kişilik çekirdek ekip
Müşteri ve proje adları gizlilik yükümlülüğü gereği paylaşılmıyor. Sektör, ölçek ve sonuçlar teslim edildiği hâliyle aktarılıyor.
Tek sözleşme
Backend, yönetim paneli ve mobilin paylaştığı düğüm şeması
4 yüzey
Mantık motoru, yönetim paneli, API ve tablet istemcisi
Düğüm grafiği
Otomasyon elle yazılmaz, görsel olarak kurulur
Android · iOS · web
Tek React Native kod tabanı
Bağlam
Müşteri KNX tabanlı bina otomasyon donanımı üretiyor. Firma, önce kendi cihazlarını, ardından KNX protokolünü konuşan herhangi bir üçüncü taraf cihazı kontrol edip izleyecek bir yazılım platformuna ihtiyaç duyuyordu.
Kapsam olarak Home Assistant’a benzer, ama KNX cihazlarını kutudan çıktığı gibi desteklemesiyle ayrışıyor: kurulumcudan hiçbir entegrasyon işi beklenmiyor. Ürün tablet öncelikli; mobil ve web sonraki yüzeyler olarak planlandı.
Üç kişilik çekirdek ekip: mimariyi ve uygulamayı sahiplenen iki kıdemli mühendis ve bir tasarımcı. Bu iki koltuktan birini ve genel mimariyi biz üstlendik.
Problem
Böyle bir platformun yapısal bir tuzağı var. Bir cihaz düğümünün tanımına (metadata’sı, bağlantı tutamakları, doğrulama kuralları) üç taraf birden ihtiyaç duyuyor: onu çalıştıran backend motoru, kurulumcunun onu kurguladığı yönetim paneli ve onu gösteren mobil istemci. Üç kez tanımlarsanız üç tanım birbirinden ayrılır. Sonra bir kurulumcu, motorun çalıştırmayı reddettiği bir otomasyon kurgular ve üçünden hangisinin yanlış olduğunu kimse söyleyemez.
İkinci kısıt: kurulumcular programcı değil. Otomasyon mantığının elle kural yazmadan kurgulanabilmesi gerekiyordu.
Yaklaşım
Her yerde aynı biçimde tüketilen tek tipli sözleşme
Platformun paylaşımlı sözleşme kütüphanesini tasarladık: her düğüm bileşenini, metadata şemasını, bağlantı tutamağı modelini ve TypeBox ile çalışma zamanı doğrulamasını tanımlayan, sıkı tipli paylaşılan bir TypeScript kütüphanesi. Backend motoru, yönetim paneli ve mobil istemci tarafından aynı biçimde tüketiliyor; böylece bir düğümün sözleşmesi tüm platformda tam olarak bir kez tanımlanıyor ve ona yapılan bir değişiklik üçüne birden ulaşıyor.
Mantık yürütme motoru
Mantık yürütme motoru platformun çekirdeğidir: bir NATS mesaj veri yolunu Socket.IO istemcilerine bağlayan, cihaz olaylarını birleştirilebilir mantık düğümlerinden oluşan bir grafik üzerinden yönlendiren bir TypeScript/Fastify servisi. Grafikteki düğümler arasında boolean operatörler, gecikme, saat, anahtar, toggle, dimmer, termostat, KNX cihaz düğümleri ve VoIP/SIP düğümleri yer alıyor.
Motor soyut bir düğüm sözleşmesi üzerine kurulu; yani yeni düğüm tipleri motoru değiştirmeden eklenebiliyor. Platform ile ürün arasındaki fark buradadır: motorun termostatın ne olduğunu bilmesi gerekmiyor.
Elle kural yazmak yerine görsel editör
Otomasyon editörünü Next.js yönetim panelinde React Flow üzerine kurduk; kurulumcular kural yazmak yerine mantığı bir düğüm grafiği olarak kurguluyor. Durum yönetimi Redux Toolkit ve redux-saga ile yapılıyor, arayüz ise tam olarak uluslararasılaştırıldı.
Tablet istemcisi
Tablet öncelikli kontrol uygulaması React Native / Expo ile kurulu; aynı tipli sözleşmeleri paylaşıyor ve mantık motoruyla Socket.IO üzerinden gerçek zamanlı konuşuyor; tek kod tabanından Android, iOS ve web’i hedefliyor.
SIP/VoIP interkom
İnterkom alt sistemini kavram kanıtı olarak uçtan uca tasarlayıp kurduk: TypeScript/Node backend’i ve gösterim amaçlı Android ve iOS istemci uygulamaları. Entegrasyon noktaları mantık motorunda SipNode ve VoipNode olarak hâlihazırda mevcut; tam platform entegrasyonu beklemede.
Geliştirme standartları
semantic-release ile ekip için yayınlanan özel paylaşımlı bir ESLint kural paketi yazıldı; buna Jest test takımları, sıkı TypeScript yapılandırması, Prettier, Husky pre-commit hook’ları ve Bitbucket Pipelines CI eklendi.
Sonuç
- Platformdaki her katman, her dil ve her mimari kararda teslim yapıldı: TypeScript mantık motoru ve paylaşımlı kütüphaneler, Next.js yönetim paneli, dotnet core API ve React Native istemci.
- Bir düğümün tanımı tam olarak tek bir yerde yaşıyor. Düğüm tipi eklemek, üç kod tabanında koordine bir düzenleme değil; paylaşımlı sözleşmelerde bir değişiklik ve yeni bir düğüm implementasyonu.
- Kurulumcular otomasyonu görsel olarak kurguluyor; doğrulama, motorun karşısında çalıştırdığı şemanın aynısından türüyor.
- Çalışma, kesintisiz 12 aylık bir inşadan talep bazlı sürekli işe devam etti.
İlgili işler
Kurumsal perakende e-ticaret
Kurumsal bir e-ticaret platformunu günde 1.000 hatadan çift haneye indirmek
Büyük bir optik perakende zinciri için kurulmuş composable commerce platformu günde yaklaşık bin hata kaydı üretiyor, indirimlerde zaman aşımına düşüyor ve yanlış tutar tahsil ediyordu. Hata sınıflarını sırayla aşağı çektik.
~1.000 → çift haneliGünlük hata kaydı
Vaka çalışmasını okuyun →
Düzenlemeye tabi tüketici ürünleri · D2C
Düzenlemeye tabi bir doğrudan satış mağazası, 45 günde canlı ve ödeme alıyor
İşi, rakiplerin vermediği bir taahhütle kazandık: 45 gün içinde kart ödemesi alan özel bir mağaza, %100 uptime garantisi altında. İkisi de tutuldu.
45 günSıfırdan canlı kart ödemesine
Vaka çalışmasını okuyun →
Lead-generation SaaS
Bir SaaS platformunun ölçeklenme tavanını kaldırmak
Editörde on eşzamanlı kullanıcı tüm ürünü dakikalarca beklemeye düşürüyordu. O yükü önce izole ettik, sonra kalanı ayrıştırdık; müşteri tabanı mimari sınır olmadan altı katına çıktı.
300 → ~2.000İş süresince müşteri hesabı
Vaka çalışmasını okuyun →