Veri Tabanı Sink Konfigürasyonu

Veri Tabanı Sink Tanımı

Veri Tabanı Sink Tanımı

  • ConnectionString: Veri tabanı sink'e bağlanmak için kullanılacak bağlantı dizesi
  • DbType: Veri tabanı sink'e bağlanmak için kullanılacak veri tabanı tipi
  • Enabled: Veri tabanı sink'in aktif olup olmayacağı
  • Name: Veri tabanı sink'in adı
  • Publish: Public Only Configuration: Veri tabanı sink'e sadece tanımların gönderilip göndeirlmeyeceği
  • Publish: Publish Only Latest DateTime Values: Veri tabanı sinkine tarih/zaman tipinden okunan sinyallerin sadece son değerlerinin mi gönderilip gönderilmeyeceği
  • Publish: Publish Only Latest Guid Values: Veri tabanı sinkine Guid tipinden okunan sinyallerin sadece son değerlerinin mi gönderilip gönderilmeyeceği
  • Publish: Publish Only Latest String Values: Veri tabanı sinkine metin tipinden okunan sinyallerin sadece son değerlerinin mi gönderilip gönderilmeyeceği
  • Publish Discards: Discard Empty Guid: Boş Guid (00000000-0000-0000-0000-000000000000) değerlerin göz ardı edilip edilmeyeceği
  • Publish Discards: Discard Empty String: Boş metin değerlerin göz ardı edilip edilmeyeceği
  • Publish Discards: Discard Min DateTime Values:
  • Discard Zero: Okunan nümerik değerlerden 0 olanların göz ardı edilip edilmeyeceği

Redis Sink Konfigürasyonu

{
      "sinkType": "Database",
      "sinkKind": "Integration",
      "connectionStringEnc": "",
      "dbType": "pgsql",
      "discardZeroValues": false,
      "discardEmptyString": false,
      "discardEmptyGuid": false,
      "discardMinDateTime": false,
      "doNotPublishValues": false,
      "publishOnlyLatestStringValues": true,
      "publishOnlyLatestGuidValues": true,
      "publishOnlyLatestDateTimeValues": true,
      "mqttWorkOrderSubscribers": [],
      "redisWorkOrderSubscribers": [],
      "rabbitWorkOrderSubscribers": [],
      "workOrderSubscribers": [],
      "uid": "490cb92c-ced2-4b2a-a8d0-8f3e6b5bbf39",
      "id": "490cb92c-ced2-4b2a-a8d0-8f3e6b5bbf39",
      "enabled": false,
      "name": "TimeScale Docker"
    }

Veri tabanı sinkinin veri gönderdiği tabloların yapısı aşağıdaki C# sınıfları ile temsil edilmektedir.

Database Sink İçin Veri Tabanının Oluşturulması

Adım-1

Database sinkinin ihtiyaç duyduğu veri tabanı tablolarını oluşturmak için kullanacağınız nw-db uygulamasını indirdiğiniz Windows veya Linux kurulum klasörü içindeki Trex.NightWatch.DbMigrator alt klasöründe bulabilirsiniz.

Adım-2

nw-db uygulamasını komut satırında nw-db --help komutu ile çalıştırın. Aşağıdaki gibi bir çıktı alacaksınız.

NightWatch Database Migrator

NightWatch Database Migrator

  • -p|--provider: Veri tabanı sağlayıcısı. pgsql,mssql,sqlite ve mysql desteklenmektedir.
  • -c|--cs: Veri tabanı bağlantı cümlesi. Farklı veri tabanlarının bağlantı cümlesi formatlarını bu adresten öğrenebilirsiniz.

Örnek Kullanım

$ nw-db -p "pgsql" -c "Host=localhost;Port=5432;Database=nightwatch;Username=postgres;Password=postgres"

Docker Kullanımı

nw-db aracının Docker üzerinde de imajını edindikten sonra yukarıda açıklamasını yaptığımız parametreler ile kullanabilirsiniz.

Konfigürasyon Tanımları

Tüm konfigürasyon tanımları NwBaseDefinition sınıfından türer, dolayısıyla bu sınıftan türeyen tüm tanımlar bu sınıfın alanlarını içerir.

public abstract class NwBaseDefinition
{
    [Key]
    [Column("id")]
    public long Id { get; set; }

    [Column("tenant_id")]
    public Guid? TenantId { get; set; }

    [Column("instance_id")]
    public Guid? InstanceId { get; set; } 

    [Column("external_id")]
    public string? ExternalId { get; set; }

    [Column("external_group_code")]
    public string? ExternalGroupCode { get; set; }

    [Column("display_name")]
    public string? DisplayName { get; set; }

    [Column("version_no")]
    public int? VersionNo { get; set; }

}
  • NwDeviceEntity, konfigürasyon içinde yer alan Device tipinden tanımların özet bilgisini ifade eder.
[Table("trex_nightwatch_device")]
public class NwDeviceEntity: NwBaseDefinition
{
    [Column("instance_name")]
    public string? InstanceName { get; set; }

    [Column("version")]
    public string? Version { get; set; }

    [Column("config_uid")]
    public Guid? ConfigUid { get; set; }

    [Column("device_group_uid")]
    public Guid DeviceGroupUid { get; set; }


    [Column("device_uid")]
    public Guid DeviceUid { get; set; }

    [Column("name")]
    public string? Name { get; set; }


    [Column("ip_address")]
    public string? IpAddress { get; set; }

    [Column("port_no")]
    public int PortNo { get; set; }

    [Column("inserted_on")]
    public DateTimeOffset InsertedOn { get; set; }

    public virtual List<NwUnitEntity> Units { get; set; } = new();


    [Column("collector_type")]
    public DataCollectorTypes? DataCollectorType { get; set; }

    [Column("collector_type_name")]
    public string? DataCollectorTypeName { get; set; }
}
  • NwUnitEntity, konfigürasyon içinde yer alan Unit tipinden tanımların özet bilgisini ifade eder.
[Table("trex_nightwatch_unit")]
public class NwUnitEntity: NwBaseDefinition
{
    [Column("device_id")]
    public long DeviceId { get; set; }

    [Column("unit_uid")]
    public Guid UnitUid { get; set; }

    [Column("plant_id")]
    public Guid? PlantId { get; set; }

    [Column("plant_name")]
    public string? PlantName { get; set; }

    [Column("plant_no")]
    public string? PlantNo { get; set; }

    [Column("plant_code")]
    public string? PlantCode { get; set; }


    [Column("name")]
    public string? Name { get; set; }

    [Column("inserted_on")]
    public DateTimeOffset InsertedOn { get; set; }

    [ForeignKey(nameof(DeviceId))]
    public virtual NwDeviceEntity Device { get;set; }

    public virtual List<NwReadingDefEntity> ReadingDefs { get; set; } = new();
}
  • NwReadingDefEntity, konfigürasyon içinde yer alan ReadingDefinition tipinden tanımların özet bilgisini ifade eder.
[Table("trex_nightwatch_reading_def")]
public class NwReadingDefEntity: NwBaseDefinition
{


    [Column("unit_id")]
    public long UnitId { get; set; }

    [Column("address")]
    public int Address { get; set; }

    [Column("readingdef_name")]
    public string? ReadingDefinitionName { get; set; }

    [Column("readingdef_uid")]
    public Guid ReadingDefinitionUid { get; set; }

    [Column("formula_name")]
    public string? FormulaName { get; set; }

    [Column("si_unit")]
    public string? MeasurementUnit{ get; set; }

    [Column("inserted_on")]
    public DateTimeOffset InsertedOn { get; set; }

    [ForeignKey(nameof(UnitId))]
    public virtual NwUnitEntity Units { get; set; }


    [Column("external_signal_type")]
    public string? ExternalSignalType { get; set; }

    [Column("external_signal_category")]
    public string? ExternalSignalCategory { get; set; }


    [Column("array_start_index")]
    public int? ArrayStartIndex { get; set; }

    [Column("array_end_index")]
    public int? ArrayEndIndex { get; set; }

    [Column("exclude_from_oee")]
    public bool? ExcludeFromOee { get; set; }

}

Zaman Serisi Verisi Tanımları

NighWatch tarafından toplanan tüm sinyal değerlerinin zaman serisi verisini temsil eden sınıflar NwBaseData sınıfından türer, dolayısıyla bu sınıftan türeyen tüm tanımlar bu sınıfın alanlarını içerir.

public abstract class NwBaseData
{
    [Key]
    [Column("id")]
    public Guid Id { get; set; }

    [Column("tenant_id")]
    public Guid? TenantId { get; set; }


    [Column("instance_id")]
    public Guid? InstanceId { get; set; }


    [Column("readingdef_uid")]
    public Guid ReadingDefinitionUid { get; set; }

    [Column("external_id")]
    public string? ExternalId { get; set; }


    [Column("time")]
    public DateTimeOffset Time { get; set; }

    [Column("inserted_on")]
    public DateTimeOffset InsertedOn { get; set; }

    [Column("source_utc_timestamp")]
    public DateTimeOffset? SourceUtcTimestamp { get; set; }

    [Column("server_utc_timestamp")]
    public DateTimeOffset? ServerUtcTimestamp { get; set; }

    [Column("index")]
    public int? Index { get; set; }

    [Column("correlation_id")]
    public long? CorrelationId { get; set; }

    [Column("is_expression")]
    public bool? IsExpression { get; set; }

    [Column("is_manual_entry")]
    public bool? IsManualEntry { get; set; } = false;

    [Column("version_no")]
    public int? VersionNo { get; set; }

}
  • NwDataNumericEntity, nümerik makine ve sensör verisini serisi verisinin temsil eden sınıf.
[Table("trex_nightwatch_data")]
public class NwDataNumericEntity: NwBaseData
{

    [Column("value")]
    public double? Value { get; set; }
}
  • NwDataStringEntity, metin tipinden makine ve sensör verisini zaman serisi verisinin temsil eden sınıf.
[Table("trex_nightwatch_data_string")]
public class NwDataStringEntity: NwBaseData
{

    [Column("value")]
    public string? Value { get; set; }

}
  • NwDataDateTimeEntity, Tarih tipinden makine ve sensör verisini zaman serisi verisinin temsil eden sınıf.
[Table("trex_nightwatch_data_datetime")]
public class NwDataDateTimeEntity: NwBaseData
{

    [Column("value")]
    public DateTime? Value { get; set; }
}
  • NwDataDateTimeEntity, Guid tipinden makine ve sensör verisini zaman serisi verisinin temsil eden sınıf.
[Table("trex_nightwatch_data_guid")]
public class NwDataGuidEntity: NwBaseData
{
    [Column("value")]
    public Guid? Value { get; set; }
}