Ana içeriğe geç

Sentetik Veri — REST API

REST API için hazırlanan Demo Fabrika akışı, Node-RED üzerinden yedi mock endpoint sunar. Her istek anında JavaScript ile üretilen gerçekçi bir JSON yanıtı döner. Bu sayede Pirivision'da REST veri kaynağını gerçek bir servise ihtiyaç duymadan deneyebilirsiniz.


Endpoint Listesi

Endpoint Yanıt Açıklama
GET /api/oee/today Tek nesne Anlık OEE özeti
GET /api/sayac/anlik Tek nesne Monoton artan üretim sayacı
GET /api/sicaklik/trend?hat=HAT-1&hours=24 Dizi 5 dk granüler sıcaklık geçmişi
GET /api/vardiya/dun Dizi (3) Dünkü vardiya toplam üretimleri
GET /api/durus/dagilim?gun=7 Dizi (5) Duruş tipi dağılımı
GET /api/alarm/son50 Dizi (50) Son 50 alarm kaydı
GET /api/recete?makine=M01 Dizi (8 / 4) Makine reçete parametreleri

Yanıt Üretim Mantığı

GET /api/oee/today

Her istek için OEE bileşenleri gerçekçi aralıklarda rassal üretilir:

msg.payload = {
    hat:               "HAT-1",
    oee:               +(78 + Math.random() * 12).toFixed(1),   // %78–90
    performans:        +(85 + Math.random() * 10).toFixed(1),   // %85–95
    kalite:            +(95 + Math.random() *  4).toFixed(1),   // %95–99
    kullanilabilirlik: +(88 + Math.random() *  8).toFixed(1),   // %88–96
    ts:                new Date().toISOString()
};

Örnek yanıt:

{ "hat": "HAT-1", "oee": 83.4, "performans": 91.2, "kalite": 97.1, "kullanilabilirlik": 92.5, "ts": "..." }


GET /api/sayac/anlik

Her istekte bir artar; Node-RED yeniden başlatılana kadar sıfırlanmaz:

let n = context.get('n') || 0;
n = n + 1;
context.set('n', n);

msg.payload = { sayac: n, ts: new Date().toISOString(), hat: "HAT-1" };

GET /api/sicaklik/trend?hat=HAT-1&hours=24

hours parametresine göre 5 dakikalık granülerlikte geçmiş noktalar üretilir (varsayılan: 24 saat → ~289 nokta). Değerler PostgreSQL sıcaklık modeliyle aynı formülü kullanır:

const hat    = msg.req.query.hat   || 'HAT-1';
const hours  = parseInt(msg.req.query.hours || '24', 10);
const points = hours * 12;   // saat başına 12 nokta
const now    = Date.now();
const data   = [];

for (let i = points; i >= 0; i--) {
    const ts    = new Date(now - i * 5 * 60 * 1000);
    const t     = ts.getTime() / 1000;
    const value = +(70 + 5 * Math.sin(t / 3600) + (Math.random() - 0.5) * 1.5).toFixed(2);
    data.push({ ts: ts.toISOString(), value, unit: "°C", makine_id: "M01", hat_id: hat });
}
msg.payload = data;

GET /api/vardiya/dun

Dünkü üç vardiya için toplam üretim adedi:

msg.payload = [
    { vardiya: "V1", toplam: 4000 + Math.floor(Math.random() * 800) },
    { vardiya: "V2", toplam: 4000 + Math.floor(Math.random() * 800) },
    { vardiya: "V3", toplam: 3500 + Math.floor(Math.random() * 800) }
];

GET /api/durus/dagilim?gun=7

gun parametresine bağlı hacimde beş duruş tipi için adet döner; büyükten küçüğe sıralı:

const gun    = parseInt(msg.req.query.gun || '7', 10);
const tipler = ['Planlı Bakım','Arıza','Ayar Değişimi','Malzeme Bekleme','Vardiya Devri'];

msg.payload = tipler
    .map(t => ({ duris_tipi: t, adet: Math.floor(20 + Math.random() * 120 * (gun / 7)) }))
    .sort((a, b) => b.adet - a.adet);

GET /api/alarm/son50

50 alarm kaydı; her biri rassal makine, kod, açıklama ve öncelik içerir:

const kodlar      = ['ALR-001','ALR-002','ALR-003','ALR-004','ALR-005'];
const aciklamalar = [
    '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ı'
];
const oncelikler = ['Düşük','Orta','Yüksek','Kritik'];
const now = Date.now();
const data = [];

for (let i = 0; i < 50; i++) {
    const ts = new Date(now - i * Math.floor(Math.random() * 20 * 60 * 1000));
    data.push({
        zaman:      ts.toLocaleString('tr-TR'),
        makine_id:  'M0' + (1 + Math.floor(Math.random() * 6)),
        alarm_kodu: kodlar[Math.floor(Math.random() * kodlar.length)],
        aciklama:   aciklamalar[Math.floor(Math.random() * aciklamalar.length)],
        oncelik:    oncelikler[Math.floor(Math.random() * oncelikler.length)]
    });
}
msg.payload = data;

GET /api/recete?makine=M01

makine parametresine göre reçete listesi döner. M01 için 8, M02 için 4 parametre; diğer değerler M01 listesini döner:

const makine    = msg.req.query.makine || 'M01';
const paramsM01 = [
    { etiket: 'Sıcaklık Setpoint', deger: '85.00 °C'    },
    { etiket: 'Basınç Setpoint',   deger: '6.50 bar'    },
    { etiket: 'Hat Hızı',          deger: '120.00 m/dk' },
    { etiket: 'Karışım Oranı',     deger: '45.00 %'     },
    { etiket: 'Soğutma Süresi',    deger: '30.00 sn'    },
    { etiket: 'Pres Tonajı',       deger: '250.00 ton'  },
    { etiket: 'Yağ Sıcaklığı',     deger: '55.00 °C'    },
    { etiket: 'Çevrim Süresi',     deger: '18.50 sn'    }
];
const paramsM02 = [
    { etiket: 'Sıcaklık Setpoint', deger: '90.00 °C'    },
    { etiket: 'Basınç Setpoint',   deger: '7.00 bar'    },
    { etiket: 'Hat Hızı',          deger: '100.00 m/dk' },
    { etiket: 'Karışım Oranı',     deger: '50.00 %'     }
];
msg.payload = makine === 'M02' ? paramsM02 : paramsM01;

Node-RED'e Yükleme

  1. Node-RED arayüzünü (http://<sunucu>:1880) tarayıcınızda açın.
  2. Sağ üst köşedeki menü → Import seçeneğine tıklayın.
  3. demo_fabrika_rest.json dosyasını seçin → ImportDeploy.

Akış devreye girdikten sonra tüm endpoint'ler istek almaya hazırdır.


Pirivision'a Ekleme

  1. Port → Yeni Veri Kaynağı → REST API yolunu izleyin.
  2. Base URL olarak Node-RED sunucu adresini girin (örneğin http://<sunucu>:1880).
  3. Test and Save ile kaynağı kaydedin.

Kayıt tamamlandıktan sonra Compass'ta bu kaynağı seçerek yukarıdaki endpoint'lerden birini kullanabilirsiniz.