Ana içeriğe geç

Sentetik Veri — PostgreSQL

PostgreSQL için hazırlanan Demo Fabrika veri seti, Pirivision'daki grafik ve sorgu örneklerinin büyük çoğunluğunu karşılar. Aşağıda hangi tabloların oluşturulduğu, verinin nasıl üretildiği ve bu kaynağı Pirivision'a nasıl ekleyeceğiniz anlatılmaktadır.


Oluşturulan Tablolar

Tüm tablolar public şemasında açılır.

Referans Tabloları

Sabit değerleri tutan dört arama tablosu:

-- 2 üretim hattı
CREATE TABLE public.hatlar (
    hat_id  text PRIMARY KEY,
    ad      text NOT NULL
);

-- 6 makine (hat başına 3)
CREATE TABLE public.makineler (
    makine_id  text PRIMARY KEY,
    hat_id     text NOT NULL REFERENCES public.hatlar (hat_id),
    marka      text NOT NULL,
    model      text NOT NULL
);

-- 3 vardiya
CREATE TABLE public.vardiyalar (
    vardiya    text PRIMARY KEY,
    baslangic  time NOT NULL,
    bitis      time NOT NULL,
    aciklama   text NOT NULL
);

-- 4 ürün ailesi
CREATE TABLE public.urun_aileleri (
    urun_kodu  text PRIMARY KEY,
    ad         text NOT NULL
);

Bu tablolara eklenen sabit değerler:

INSERT INTO public.hatlar VALUES
    ('HAT-1', 'Üretim Hattı 1'),
    ('HAT-2', 'Üretim Hattı 2');

INSERT INTO public.makineler VALUES
    ('M01', 'HAT-1', 'Siemens',    'PXC-100'),
    ('M02', 'HAT-1', 'ABB',        'IRB-2600'),
    ('M03', 'HAT-1', 'Fanuc',      'R-2000iC'),
    ('M04', 'HAT-2', 'Kuka',       'KR-210'),
    ('M05', 'HAT-2', 'Mitsubishi', 'RV-7FR'),
    ('M06', 'HAT-2', 'Yaskawa',    'GP-25');

INSERT INTO public.vardiyalar VALUES
    ('V1', '06:00', '14:00', 'Sabah Vardiyası'),
    ('V2', '14:00', '22:00', 'Akşam Vardiyası'),
    ('V3', '22:00', '06:00', 'Gece Vardiyası');

INSERT INTO public.urun_aileleri VALUES
    ('A', 'Ürün-A'), ('B', 'Ürün-B'),
    ('C', 'Ürün-C'), ('D', 'Ürün-D');

Olay ve Zaman Serisi Tabloları

sensor_zaman_serisi — ~51 840 satır

Her makine için 30 gün boyunca 5 dakikalık aralıklarla sıcaklık ve basınç ölçümleri.

CREATE TABLE public.sensor_zaman_serisi (
    ts          timestamptz NOT NULL,
    hat_id      text        NOT NULL REFERENCES public.hatlar    (hat_id),
    makine_id   text        NOT NULL REFERENCES public.makineler (makine_id),
    sicaklik    numeric(6,2),
    basinc      numeric(5,2)
);

Veri 30 gün × 288 zaman noktası × 6 makine formülüyle üretilir. Sıcaklık; 70 °C baz değeri üzerine saatlik sinüs dalgası, makineye özgü bir offset ve küçük rassal gürültü eklenerek hesaplanır:

INSERT INTO public.sensor_zaman_serisi (ts, hat_id, makine_id, sicaklik, basinc)
SELECT
    g.ts,
    m.hat_id,
    m.makine_id,
    ROUND( (70
            + 5 * sin(extract(epoch FROM g.ts) / 3600.0)
            + (CASE WHEN m.makine_id IN ('M01','M04') THEN -1.5
                    WHEN m.makine_id IN ('M02','M05') THEN  0.0
                    ELSE  1.5 END)
            + (random() - 0.5) * 3.0
           )::numeric, 2) AS sicaklik,
    ROUND( (6.5
            + 0.4 * sin(extract(epoch FROM g.ts) / 5400.0)
            + (random() - 0.5) * 0.3
           )::numeric, 2) AS basinc
FROM generate_series(
        NOW() - INTERVAL '30 days',
        NOW(),
        INTERVAL '5 minutes'
     ) AS g(ts)
CROSS JOIN public.makineler AS m;

vardiya_uretim — ~540 satır

Her gün, her makine ve her vardiya için üretim adedi ve hedef.

CREATE TABLE public.vardiya_uretim (
    ts            date    NOT NULL,
    hat_id        text    NOT NULL REFERENCES public.hatlar        (hat_id),
    makine_id     text    NOT NULL REFERENCES public.makineler     (makine_id),
    vardiya       text    NOT NULL REFERENCES public.vardiyalar    (vardiya),
    urun_kodu     text    NOT NULL REFERENCES public.urun_aileleri (urun_kodu),
    uretim_adet   integer NOT NULL,
    hedef         integer NOT NULL
);
INSERT INTO public.vardiya_uretim
    (ts, hat_id, makine_id, vardiya, urun_kodu, uretim_adet, hedef)
SELECT
    d.gun,
    m.hat_id,
    m.makine_id,
    v.vardiya,
    (ARRAY['A','B','C','D'])[1 + floor(random()*4)::int],
    (250 + floor(random() * 200))::int,
    400
FROM generate_series(
        CURRENT_DATE - INTERVAL '30 days',
        CURRENT_DATE,
        INTERVAL '1 day'
     ) AS d(gun)
CROSS JOIN public.makineler AS m
CROSS JOIN public.vardiyalar AS v;

duris_log

Her makine için günde 5–15 duruş kaydı; duruş tipi ve süresi rassal seçilir.

CREATE TABLE public.duris_log (
    ts          timestamptz NOT NULL,
    hat_id      text        NOT NULL REFERENCES public.hatlar    (hat_id),
    makine_id   text        NOT NULL REFERENCES public.makineler (makine_id),
    duris_tipi  text        NOT NULL,
    sure_dk     integer     NOT NULL
);
INSERT INTO public.duris_log (ts, hat_id, makine_id, duris_tipi, sure_dk)
SELECT
    d.gun + (random() * INTERVAL '24 hours'),
    m.hat_id,
    m.makine_id,
    (ARRAY['Planlı Bakım','Arıza','Ayar Değişimi',
           'Malzeme Bekleme','Vardiya Devri'])
        [1 + floor(random()*5)::int],
    (5 + floor(random() * 90))::int
FROM generate_series(
        CURRENT_DATE - INTERVAL '30 days',
        CURRENT_DATE,
        INTERVAL '1 day'
     ) AS d(gun)
CROSS JOIN public.makineler AS m
CROSS JOIN generate_series(1, (5 + floor(random() * 10))::int) AS k(n);

alarm_log

Günde 2–8 alarm; beş farklı alarm kodu, makine ve öncelik seviyesi rassal atanır.

CREATE TABLE public.alarm_log (
    ts           timestamptz NOT NULL,
    makine_id    text        NOT NULL REFERENCES public.makineler (makine_id),
    alarm_kodu   text        NOT NULL,
    aciklama     text        NOT NULL,
    oncelik      text        NOT NULL
);
CREATE INDEX ON public.alarm_log (ts DESC);
INSERT INTO public.alarm_log (ts, makine_id, alarm_kodu, aciklama, oncelik)
SELECT
    d.gun + (random() * INTERVAL '24 hours'),
    'M0' || (1 + floor(random()*6))::int,
    (ARRAY['ALR-001','ALR-002','ALR-003','ALR-004','ALR-005'])
        [1 + floor(random()*5)::int],
    (ARRAY['Yüksek sıcaklık eşiği aşıldı','Düşük basınç uyarısı',
           'Motor titreşim seviyesi yüksek','Yağ seviyesi kritik',
           'Sensör iletişim hatası'])
        [1 + floor(random()*5)::int],
    (ARRAY['Düşük','Orta','Yüksek','Kritik'])
        [1 + floor(random()*4)::int]
FROM generate_series(
        CURRENT_DATE - INTERVAL '30 days',
        CURRENT_DATE,
        INTERVAL '1 day'
     ) AS d(gun)
CROSS JOIN generate_series(1, (2 + floor(random() * 7))::int) AS k(n);

oee_gunluk

Her hat için 30 günlük OEE metrikleri; değerler gerçekçi aralıklarda rassal üretilir.

CREATE TABLE public.oee_gunluk (
    ts                 date         NOT NULL,
    hat_id             text         NOT NULL REFERENCES public.hatlar (hat_id),
    oee_yuzde          numeric(5,2) NOT NULL,
    performans         numeric(5,2) NOT NULL,
    kalite             numeric(5,2) NOT NULL,
    kullanilabilirlik  numeric(5,2) NOT NULL,
    PRIMARY KEY (ts, hat_id)
);
INSERT INTO public.oee_gunluk
    (ts, hat_id, oee_yuzde, performans, kalite, kullanilabilirlik)
SELECT
    d.gun,
    h.hat_id,
    ROUND((75 + (random() * 20))::numeric, 2),   -- OEE %75–95
    ROUND((85 + (random() * 12))::numeric, 2),   -- Performans %85–97
    ROUND((95 + (random() *  5))::numeric, 2),   -- Kalite %95–100
    ROUND((88 + (random() * 10))::numeric, 2)    -- Kullanılabilirlik %88–98
FROM generate_series(
        CURRENT_DATE - INTERVAL '30 days',
        CURRENT_DATE,
        INTERVAL '1 day'
     ) AS d(gun)
CROSS JOIN public.hatlar AS h;

recete_parametre

M01 için 8, M02 için 4 sabit makine parametresi.

CREATE TABLE public.recete_parametre (
    makine_id      text          NOT NULL REFERENCES public.makineler (makine_id),
    parametre_adi  text          NOT NULL,
    deger          numeric(10,2) NOT NULL,
    birim          text          NOT NULL,
    siralama       integer       NOT NULL,
    PRIMARY KEY (makine_id, parametre_adi)
);

INSERT INTO public.recete_parametre VALUES
    ('M01', 'Sıcaklık Setpoint',  85.00, '°C',   1),
    ('M01', 'Basınç Setpoint',     6.50, 'bar',  2),
    ('M01', 'Hat Hızı',          120.00, 'm/dk', 3),
    ('M01', 'Karışım Oranı',      45.00, '%',    4),
    ('M01', 'Soğutma Süresi',     30.00, 'sn',   5),
    ('M01', 'Pres Tonajı',       250.00, 'ton',  6),
    ('M01', 'Yağ Sıcaklığı',      55.00, '°C',   7),
    ('M01', 'Çevrim Süresi',      18.50, 'sn',   8),
    ('M02', 'Sıcaklık Setpoint',  90.00, '°C',   1),
    ('M02', 'Basınç Setpoint',     7.00, 'bar',  2),
    ('M02', 'Hat Hızı',          100.00, 'm/dk', 3),
    ('M02', 'Karışım Oranı',      50.00, '%',    4);

Veritabanına Yükleme

SQL scriptini PostgreSQL veritabanınıza çalıştırın:

psql -h <sunucu> -U <kullanici> -d <veritabani> -f demo_fabrika.sql

Script tamamlandığında her tablo için satır sayısını bildiren özet mesajları görürsünüz:

NOTICE:  sensor_zaman_serisi : 51840 satır
NOTICE:  vardiya_uretim      : 540 satır
NOTICE:  oee_gunluk          : 62 satır
...

Scripti tekrar çalıştırmak güvenlidir — önce mevcut demo tablolarını temizler, ardından yeniden oluşturur.


Pirivision'a Ekleme

  1. Port → Yeni Veri Kaynağı → PostgreSQL yolunu izleyin.
  2. Sunucu, port, veritabanı ve kimlik bilgilerini girin.
  3. Test and Save ile kaynağı kaydedin.

Kayıt tamamlandıktan sonra Compass'ta bu veritabanına sorgu yazabilirsiniz.