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
- Node-RED arayüzünü (
http://<sunucu>:1880) tarayıcınızda açın. - Sağ üst köşedeki menü → Import seçeneğine tıklayın.
demo_fabrika_rest.jsondosyasını seçin → Import → Deploy.
Akış devreye girdikten sonra tüm endpoint'ler istek almaya hazırdır.
Pirivision'a Ekleme
- Port → Yeni Veri Kaynağı → REST API yolunu izleyin.
- Base URL olarak Node-RED sunucu adresini girin (örneğin
http://<sunucu>:1880). - Test and Save ile kaynağı kaydedin.
Kayıt tamamlandıktan sonra Compass'ta bu kaynağı seçerek yukarıdaki endpoint'lerden birini kullanabilirsiniz.