Simülasyon Verisi İle Test

NightWatch nümerik (int,double, float), mantıksal (bool), metin (string), tarih (date time) ve uuid (guid) tipinde simülasyon verisi üretebilmektedir. NightWatch kurulumunuzu test etmek için aşağıdaki adımları takip edebilirsiniz.

EK BİLGİ

Simülasyon işlevi aşağıdaki versiyonlar ve daha üst versiyonlarda çalışır.

  • NightWatch Data Collector Uygulaması (nwx): 2.12.0.0
  • NightWatch Test Uygulaması (nw-test): 2.12.0.0

Simülasyon Verisi Üretimi

Adım-1

Örnek simülasyon konfigürasyonunu bilgisayarınıza indiriniz.

Adım-2

Ekstralar bölümü altındaki Konfigürasyonun Diskten Yüklenmesi başlığı altında yer alan nightwatchsettings.json dosya içeriğindeki NightWatch:Provider:Path yolundaki Path değerini 1. adımda indirdiğiniz Hackathon_Simulation.json dosya yolunu gösterecek şekilde güncelleyin.

Adım-3

nightwatchsettings.json içinde NightWatch:Simulation yolundaki Simulation değerini true olarak güncelleyin.

Adım-4

Simülasyon verisi üretme sıklığını saniye cinsinden aşağıdaki değeri değiştirerek güncelleyin. Bu değer varsayılan olarak 1 saniye olarak belirlenmiştir.

{
    "simulationDataGenerationIntervalInSeconds": 1,
}

Adım-5: Veri Tabanına Gönderim

Simülasyon verilerinin bir PostgreSQL (TimeScaleDb) veri tabanına yazılmasını istiyorsanız Veri Tabanı Sink Konfigürasyonu sayfasındaki Database Sink İçin Veri Tabanının Oluşturulması bölümünde anlatıldğı şekilde boş bir veri tabanı oluşturmalısınız.

Hackathon_Simulation.json dosyası içinde yer alan aşağıdaki bölümde plainTextConnectionString değerini kendi veri tabanı bağlantı bilgileriniz ile güncelleyiniz.

    "ModbusDataDbSinks": [
    {
      "sinkType": "Database",
      "sinkKind": "Integration",
      "plainTextConnectionString": "Server=localhost;Port=5432;User Id=postgres;Password=1;Database=NightWatch_Raw;",
      "dbType": "pgsql",
      "discardZeroValues": false,
      "discardEmptyString": false,
      "discardEmptyGuid": false,
      "discardMinDateTime": false,
      "doNotPublishValues": false,
      "publishOnlyLatestStringValues": false,
      "publishOnlyLatestGuidValues": false,
      "publishOnlyLatestDateTimeValues": false,
      "mqttWorkOrderSubscribers": [],
      "redisWorkOrderSubscribers": [],
      "rabbitWorkOrderSubscribers": [],
      "workOrderSubscribers": [],
      "uid": "41a89a6b-266a-4797-b615-20b4898cc1a7",
      "id": "41a89a6b-266a-4797-b615-20b4898cc1a7",
      "enabled": true,
      "name": "PostgreSQL"
    }
  ]

Adım-6: MQTT'ye Gönderim

Simülasyon verilerinin bir MQTT'ye gönderilmesi için bilgisayarınıza Mosquitto veya benzeri bir MQTT broker kurmalısınız.

Hackathon_Simulation.json dosyası içinde yer veri gönderimi ("sinkKind":"Integration") için ve alarmlar ("sinkKind": "Alert") için iki adet MQTT konfigürasyonu tanımlanmıştır. Bu konfigürasyonlarda yer alan server, port, username (varsa) ve plainTextPassword (varsa) bilgilerini kendi MQTT Broker bağlantı bilgileriniz ile güncelleyiniz.

    "mqttSinks": [
    {
      "sinkType": "MQTT",
      "maxPendingMessages": 1000,
      "autoReconnectDelayInSeconds": 10,
      "cleanSession": true,
      "topics": [
        {
          "qualityOfServiceLevel": "AtMostOnce",
          "enabled": true,
          "publishType": "Unit_Flat",
          "alertPublishType": "PerAlertMessage",
          "mesMode": "None"
        }
      ],
      "server": "localhost",
      "port": 1883,
      "username":"",
      "plainTextPassword":"",
      "uid": "2a6cca2b-b381-4007-827b-e85833e47395",
      "id": "2a6cca2b-b381-4007-827b-e85833e47395",
      "enabled": true,
      "name": "MQTT Integration",
      "sinkKind": "Integration"
    },
    {
      "sinkType": "MQTT",
      "maxPendingMessages": 1000,
      "autoReconnectDelayInSeconds": 10,
      "cleanSession": true,
      "topics": [],
      "server": "localhost",
      "port": 1883,
      "username":"",
      "plainTextPassword":"",
      "uid": "1382baf8-63e3-45b3-8000-fa79e8849c0b",
      "id": "1382baf8-63e3-45b3-8000-fa79e8849c0b",
      "enabled": true,
      "name": "MQTT Alert",
      "sinkKind": "Alert"
    }
  ]

Simülasyon Verisi Üreteçleri

Simülasyon verisi üreteç ayarları her bir sinyal konfigürasyonu altındaki simulation nesnesi içinde tanımlanır. Aşağıda örnek bir tanım görebilirsiniz.

"simulation": {
    "generatorType": "Number",
    "randomNumberGeneration": {
        "minValue": 0,
        "maxValue": 100,
        "onlyPositiveValues": true,
        "rounding": {
        "roundTo": 0
        },
        "array": {
        "arrayItemCount": 12,
        "isArray": false
        },
        "timing": {}
    },
    "gaussianNumberGeneration": {
        "mean": 100,
        "deviation": 40,
        "rounding": {
        "roundTo": 0
        },
        "array": {
        "arrayItemCount": 12,
        "isArray": false
        },
        "timing": {}
    },
    "numberGeneration": {
        "startValue": 1,
        "endValue": 300,
        "incrementBy": 1,
        "rounding": {
        "roundTo": 0
        },
        "array": {
        "arrayItemCount": 12,
        "isArray": false
        },
        "timing": {
        "keepLastValueIntervalInSecs": 5
        }
    },
    "booleanGeneration": {
        "array": {
        "arrayItemCount": 12,
        "isArray": false
        },
        "timing": {}
    },
    "guidGeneratorOptions": {
        "array": {
        "arrayItemCount": 12,
        "isArray": false
        },
        "timing": {}
    },
    "dateTimeGeneratorOptions": {
        "pickAndIterate": false,
        "array": {
        "arrayItemCount": 12,
        "isArray": false
        },
        "timing": {}
    },
    "stringGeneratorOptions": {
        "asFileName": false,
        "asFilePath": false,
        "asDirectory": false,
        "array": {
        "arrayItemCount": 12,
        "isArray": false
        },
        "timing": {}
    }
    }

Genel Simülasyon Verisi Üreteç Ayarları

public abstract class NwGeneratorOptionsBase
{
    [TypeConverter(typeof(ExpandableObjectConverter))]
    [DisplayName("Array")]
    public NwGeneratorArrayOptions Array { get; set; } = new();


    [TypeConverter(typeof(ExpandableObjectConverter))]
    [DisplayName("Timing")]
    public NwGeneratorTimingOptions Timing { get; set; } = new();

}

public class NwGeneratorArrayOptions
{
    [DisplayName("Array Item Count")]
    public int ArrayItemCount {get;set;}

    [DisplayName("Array")]
    public bool IsArray { get; set; } = false;
}

public class NwGeneratorRoundingOptions
{
    [DisplayName("Round To Decimal Places")]
    [Description("Empty or a value between 0 and 15")]
    public int? RoundTo {get;set;} 
}


public class NwGeneratorTimingOptions
{ 

    [DisplayName("Keep Last Value Interval (Seconds)")]
    public int? KeepLastValueIntervalInSecs {get;set;}
}

Rastgele Sayı Üreteci

Rastgele sayı üreteci seçenekleri randomNumberGeneration nesnesi içinde tanımlanır.

public class NwRandomNumberGeneratorOptions: NwGeneratorOptionsBase
{
    [DisplayName("Minimum Value")]
    public double MinValue { get; set; } = 0;

    [DisplayName("Maximum Value")]
    public double? MaxValue { get; set; } = 100;

    [DisplayName("Only Positive Values")]
    public bool OnlyPositiveValues { get; set; } = true;

    [TypeConverter(typeof(ExpandableObjectConverter))]
    [DisplayName("Rounding")]
    public NwGeneratorRoundingOptions Rounding { get; set; } = new();
}

Normal Dağılım Sayı Üreteci

Rastgele sayı üreteci seçenekleri gaussianNumberGeneration nesnesi içinde tanımlanır.

public class NwGaussianNumberGeneratorOptions: NwGeneratorOptionsBase
{
    [DisplayName("Mean")]
    public double Mean { get; set; } = 100;

    [DisplayName("Std. Deviation")]
    public double Deviation { get; set; } = 40;

    [TypeConverter(typeof(ExpandableObjectConverter))]
    [DisplayName("Rounding")]
    public NwGeneratorRoundingOptions Rounding { get; set; } = new();
}

Sayı Üreteci

Sayı üreteci seçenekleri numberGeneration nesnesi içinde tanımlanır.

public class NwNumberGeneratorOptions: NwGeneratorOptionsBase
{

    [DisplayName("Start Value")]
    public double StartValue { get; set; } = 0;

    [DisplayName("Stop Value")]
    public double? EndValue { get; set; } = 100;

    [DisplayName("Increment By")]
    public double IncrementBy { get; set; } = 1;

    [TypeConverter(typeof(ExpandableObjectConverter))]
    [DisplayName("Rounding")]
    public NwGeneratorRoundingOptions Rounding { get; set; } = new();
}

Boolean Üreteci

Boolean üreteci seçenekleri booleanGeneration nesnesi içinde tanımlanır.

public class NwBooleanGeneratorOptions: NwGeneratorOptionsBase
{
}

Uuid Üreteci

Uuid üreteci seçenekleri guidGeneratorOptions nesnesi içinde tanımlanır.

public class NwGuidGeneratorOptions: NwGeneratorOptionsBase
{
    public static NwGuidGeneratorOptions Default => new();
}

Tarih ve Saat Üreteci

Tarih ve saat üreteci seçenekleri dateTimeGeneratorOptions nesnesi içinde tanımlanır.

public class NwDateTimeGeneratorOptions: NwGeneratorOptionsBase
{
    [DisplayName("Pick Value And Iterate")]
    public bool PickAndIterate { get; set; }

    [DisplayName("Pick Value And Iterate By Seconds")]
    public int? PickAndIterateSeconds { get; set; }

    [Category("Between")]
    [DisplayName("Start Date")]
    public DateTime? StartDate { get; set; }

    [Category("Between")]
    [DisplayName("End Date")]
    public DateTime? EndDate { get; set; }

    [Category("Future or Past")]
    [DisplayName("Reference Date")]
    public DateTime? ReferenceDate { get; set; }

    [Category("Future or Past")]
    [DisplayName("Years To Go Forward")]
    public int? YearsToGoForward { get; set; }

    [Category("Future or Past")]
    [DisplayName("Years To Go Backward")]
    public int? YearsToGoBackward { get; set; }

    [Category("Soon or Recent")]
    [DisplayName("Days To Go Forward")]
    public int? DaysToGoForward { get; set; }

    [Category("Soon or Recent")]
    [DisplayName("Days To Go Bacjward")]
    public int? DaysToGoBackward { get; set; }
}

Metin Üreteci

Metin üreteci seçenekleri stringGeneratorOptions nesnesi içinde tanımlanır.

public class NwStringGeneratorOptions: NwGeneratorOptionsBase
{
    [Category("Lorem String")]
    public string Prefix { get; set; }

    [Category("Lorem String")]
    public string Postfix { get; set; }

    [Category("File System")]
    [DisplayName("File Name")]
    public bool AsFileName { get; set; }

    [Category("File System")]
    [DisplayName("File Path")]
    public bool AsFilePath { get; set; }

    [Category("File System")]
    [DisplayName("Directory Path")]
    public bool AsDirectory { get; set; }

    public static NwStringGeneratorOptions Default => new();
}

nw-test ile simülasyon

nw-test ile simülasyon seçimi

nw-test ile simülasyon seçimi

nw-test simülasyon verisi tablo görünümü

nw-test simülasyon verisi tablo görünümü