Skip to main content

General

Kullanıcı Fonksiyonları Yazma

Doğrudan Edge Gateway üzerinde çalışan özel C# betikleri yazarak platform mantığını genişletin.

Kural Motoru standart otomasyon görevlerini yerine getirirken, bazı senaryolar karmaşık hesaplama, durum yönetimi veya özel protokol ayrıştırma gerektirir. Bu durumlar için Proxus, derlenmiş C# Fonksiyonlarını doğrudan Edge Gateway üzerine dağıtmanıza olanak tanır.

Dağıtım ve Kapsam

Tek bir Gateway'e bağlı olan Cihazların aksine, Fonksiyonlar aynı anda birden fazla Gateway'e dağıtılabilir.

  • Belirli Atama: Fonksiyonu çalıştırmak için belirli Edge Gateway'leri seçebilirsiniz.
  • Varsayılan (SYSTEM): Yeni bir fonksiyon oluştururken, SYSTEM gateway'i varsayılan olarak otomatik seçilir. Gerektiğinde daha fazla gateway ekleyebilir veya bu atamayı değiştirebilirsiniz.

Fonksiyon Mimarisi

Kullanıcı fonksiyonları, Proxus.SDK.BaseFunctions.FunctionBase sınıfından miras alan bağımsız C# sınıflarıdır. Gateway üzerinde korumalı bir ortamda (sandbox) çalışırlar, böylece çöken bir betiğin tüm sistemi çökertmemesini sağlarlar.

Temel Yapı

Her fonksiyon OnMessageReceive metodunu geçersiz kılmalıdır (override). Bu metot, Gateway'den geçen her veri paketi için asenkron olarak tetiklenir.

using System;
using System.Threading.Tasks;
using Proxus.SDK.BaseFunctions;
using Proxus.Common.Messages;

public class MyCustomLogic : FunctionBase
{
    // Fonksiyon başladığında bir kez çağrılır
    protected override void OnStarted()
    {
        LogInformation("MyCustomLogic fonksiyonu başladı.");
        // İsteğe bağlı: Tekrarlayan bir görev ayarla
        ExecuteScheduledTask(TimeSpan.FromSeconds(30), () =>
        {
            LogInformation("Periyodik kontrol çalışıyor...");
        });
    }

    // Her telemetri paketi için çağrılır
    protected override void OnMessageReceive(FunctionContext ctx)
    {
        // 1. Mesajın TransportData olup olmadığını kontrol et
        if (ctx.Message is TransportData data)
        {
            // 2. Filtrele: Sadece belirli konuları veya cihazları işle
            if (ctx.Topic != "Gen_01")
            {
                return;
            }

            // 3. Değeri Çıkar (Mantığınızda yardımcı metod veya manuel ayrıştırma)
            // Not: TransportData yükü, anahtar-değer çiftlerinin bir listesidir
            var tempMetric = data.Payload.FirstOrDefault(p => p.Key == "Temperature");

            if (tempMetric != null && double.TryParse(tempMetric.Value, out double temp))
            {
                // 4. Mantık: Verimliliği hesapla
                double efficiency = (temp / 120.0) * 100;

                // 5. Aksiyon: Sonucu hatta geri kaydet
                if (efficiency < 50)
                {
                    LogWarning($"Düşük Verimlilik Tespit Edildi: {efficiency:F2}%");

                    // Yeni veri paketi oluştur
                    var resultData = new TransportData();
                    resultData.MetaData.Add(new MetaData { Key = "DeviceName", Value = "Gen_01_Calc" });
                    resultData.Payload.Add(new Payload
                    {
                        Key = "Efficiency",
                        Value = efficiency.ToString(),
                        Type = "Double"
                    });

                    // Sisteme geri gönder
                    Save(resultData);
                }
            }
        }
    }
}

SDK Yetenekleri

FunctionBase sınıfı, çalışma zamanı ile etkileşim kurmak için güçlü yöntemler sağlar.

Loglama

Güçlü tipli loglama yöntemlerini kullanın. Bu loglar merkezi Sistem Loglarında görünür.

MetotAçıklama
LogInformation(string)Standart bilgi logu.
LogWarning(string)Uyarı logu (sarı).
LogError(string)Hata logu (kırmızı).
LogDebug(string)Hata ayıklama logu (yalnızca hata ayıklama modu etkinleştirildiğinde görünür).

Veri İşlemleri

MetotAçıklama
Save(TransportData)Sistem hattına yeni bir veri noktası enjekte eder veya doğrudan veritabanına kaydeder.
SendNotification(channel, msg)Yapılandırılmış bir kanal (örneğin "Email", "Slack") üzerinden bir bildirim tetikler.
UpdateDeviceStatus(id, status)Sistem kaydındaki belirli bir cihazın durumunu günceller.

Gelişmiş Özellikler

1. Önbellekleme ve Durum

Fonksiyonlar durumludur. Mesajlar arasında durumu korumak için yerleşik iş parçacığı güvenli Cache sözlüğünü veya sınıf düzeyindeki değişkenleri kullanabilirsiniz.

// Otomatik önbellek temizlemeyi etkinleştir (1 saatten eski girişleri kaldırır)
EnableCacheWithExpirationTime = TimeSpan.FromHours(1);

// Önbellek Ekle/Güncelle
Cache.AddOrUpdate(DateTime.UtcNow, data, (k, v) => data);

2. Zamanlama

Ana mesaj döngüsünü engellemeden arka plan görevleri zamanlayabilirsiniz.

// Her 10 saniyede bir çalıştır
ExecuteScheduledTask(TimeSpan.FromSeconds(10), () =>
{
// Periyodik hesaplama veya temizlik yap
});

3. MQTT İstemcisi

SDK, doğrudan betiğinizden harici brokerlarla iletişim kurmak için yönetilen bir MQTT istemcisi içerir.

// Harici bir brokera yayınla
PublishMqttMessage("external/topic", "payload");

// Harici konuya abone ol (OnMessageReceive içinde işlenir)
SubscribeToMqttTopic("external/command");

En İyi Uygulamalar

  • Engelleme Yapmayın: OnMessageReceive hızlı olmalıdır. Uzun süren işlemler için Task.Run veya zamanlanmış görevler kullanın.
  • Hata Yönetimi: İşlenmeyen istisnalar çalışma zamanı tarafından yakalanır, ancak sık çökmeler fonksiyonun otomatik olarak yayından kaldırılmasına neden olabilir (Eşik: 10 istisna).
  • Bağımlılıklar: Standart .NET kütüphanelerine (System, System.Linq, System.Text.Json) bağlı kalın. Harici NuGet paketleri Gateway üzerine önceden yüklenmiş olmalıdır.