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:
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
- Port → Yeni Veri Kaynağı → PostgreSQL yolunu izleyin.
- Sunucu, port, veritabanı ve kimlik bilgilerini girin.
- Test and Save ile kaynağı kaydedin.
Kayıt tamamlandıktan sonra Compass'ta bu veritabanına sorgu yazabilirsiniz.