Yeni: Yapay zekâ güvenlik duvarı her modülü izliyor ve her olayı sade bir dille açıklıyor. Nasıl çalıştığını görün

Hesaplama betikleri

Küçük, korumalı bir JavaScript fonksiyonuyla bir kartın verilerini yeniden biçimlendirin – sözleşme, neyi yapabileceği ve yapamayacağı, sınırlar, hata yönetimi ve çalışmış örnekler.

Bir hesaplama betiği (kartın ayarlarında Transform olarak görünür), kartın yüklediği verilerden kartın çizeceği içeriği türeten küçük bir JavaScript fonksiyonudur. Hiçbir kaynak tam olarak ihtiyacınız olan biçimi vermediğinde kullanın: birimleri dönüştürmek, iki seriyi bir rota olarak eşleştirmek, satırları saymak ya da en kötü durumu seçmek gibi. Betik yalnızca hesaplama yapar. Bir parametre ayarlayamaz, bir komut çalıştıramaz, bir sayfa açamaz ve ağa erişemez.

Betik ekle

  1. Panoyu özelleştirin ve kartın ayarlarını açın.
  2. Veri sekmesinde Gelişmiş: değerleri bir betikle hesapla bölümünü açın.
  3. Bu betiği çalıştır kutusunu işaretleyin ve Betik alanını yazın.
  4. Taslağınızı kartın mevcut verileri üzerinde çalıştırmak için Şimdi çalıştır seçeneğini seçin. Sonuç alanı her yuva için dönen değerleri listeler, örneğin “series: table, 12 row(s)” ve “ran in 3 ms”.
  5. Zaman bütçesi (ms) ve Çalıştırma başarısız olduğunda değerlerini ayarlayın.
  6. Kaydet seçeneğini seçin.

Betiği kaldır onu siler. Betik karta kopyalanır, pano dosyalarıyla birlikte taşınır ve kartı bir widget olarak kaydettiğinizde kartta kalır.

Sözleşme

Betik, varsayılan dışa aktarımı eşzamanlı bir fonksiyon olan bir ES modülüdür:

export default function transform({ slots, params, window, now }) {
  // slots:  the bound data by slot key, as the source returned it (shape table | scalar | series | record)
  // params: the effective board parameters of the card's page (read-only)
  // window: { from, to, interval? } (ms since the epoch) when the card's data ran with a window
  // now:    ms since the epoch, the host's clock (a script never reads Date)
  return { slots: { /* the slots you replace */ } };
}

{ slots } döndürür. Döndürülen her yuva, yüklenen yuvanın yerine geçer; döndürmediğiniz yuvalar yüklendiği gibi kalır. Boş bir sonuç, verileri yüklendiği gibi çizer.

BiçimForm
Skaler{ shape: 'scalar', value: 21.5, meta: { unit: '°C', decimals: 1 } }
Seri{ shape: 'series', series: [{ name: 'temperature', points: [{ t: '2026-11-09T10:00:00Z', v: 21.5 }] }] }
Tablo{ shape: 'table', columns: [{ key: 'id' }, { key: 'value', type: 'number' }], rows: [{ id: 'p1', value: 3 }] }
Kayıt{ shape: 'record', record: { level: 2.4, flow: 18 } }

Bir süreç diyagramı veya 3B model kartı ayrıca scene döndürebilir: nesneler, nesne bazında geçersiz kılmalar, ek bağlantılar ve bölgeler, görünüm ve sorunlar. Yalnızca çizimi değiştirir.

Çalıştığı yer

Betik, tarayıcınızda, Hermetry’ye, ağa ya da oturumunuza erişimi olmayan gizli bir çerçevede, kendi çalışan iş parçacığında (worker) çalışır. Kartın verisi her değiştiğinde (canlı güncelleme dahil) ya da bir parametre değiştiğinde yeniden çalışır. Kart başına aynı anda yalnızca bir çalıştırma devam eder; en son girdi geçerli olur ve saniyede en fazla 20 çalıştırma yapılır. Gösterilmeyen bir kart çalışmaz. Ekran panoları betikleri aynı şekilde çalıştırır.

Sınırlar

SınırDeğer
Betik uzunluğu65.536 karakter
Zaman bütçesiÇalıştırma başına 10 ila 500 ms, varsayılan 50. Bu süre aşılırsa çalıştırma durdurulur.
Döndürülen yuvalar16
Tablo başına satır5,000
Sütunlar64
Bir metin değeri10 KiB
Tüm sonuç2 MiB
Bir sahnedeki nesnelerSüreç diyagramında 500, 3B modelde 2.000

Çalıştırma başarısız olduğunda

Çalıştırma başarısız olduğundaKart
Önceki sonucu koruSon başarılı çıktıyı korur ve Transform failed rozetini gösterir
Kartı boş gösterVerinin yerine hatayı gösterir

Iletiler: “The script ran past its time budget: …”, “The script could not be loaded: …”, “Transform failed: …”.

Örnekler

Bir istatistik kartında Celsius’tan Fahrenheit’e (value yuvası):

export default function transform({ slots }) {
  const c = slots.value && typeof slots.value.value === 'number' ? slots.value.value : null;
  if (c === null) return {};
  return { slots: { value: { shape: 'scalar', value: c * 9 / 5 + 32, meta: { unit: '°F', decimals: 1 } } } };
}

Bir parametrenin cihazlarındaki açık alarmları sayın (value yuvası Alarms (live) tablosuna bağlı bir istatistik kartı):

export default function transform({ slots }) {
  const rows = slots.value && Array.isArray(slots.value.rows) ? slots.value.rows : [];
  return { slots: { value: { shape: 'scalar', value: rows.length, meta: { decimals: 0 } } } };
}

Enlem ve boylam serilerinden bir rota (routes yuvası lat,lng anahtarlarıyla Device readings over time serisine bağlı bir harita):

export default function transform({ slots }) {
  const series = slots.routes && Array.isArray(slots.routes.series) ? slots.routes.series : [];
  const named = (k) => series.find((s) => s && s.name === k) || { points: [] };
  const lng = new Map(named('lng').points.map((p) => [p.t, p.v]));
  const track = named('lat').points
    .filter((p) => lng.has(p.t))
    .map((p) => [p.v, lng.get(p.t), Date.parse(p.t)])
    .sort((a, b) => a[2] - b[2]);
  return { slots: { routes: { shape: 'table',
    columns: [{ key: 'name' }, { key: 'positions' }],
    rows: track.length >= 2 ? [{ id: 'route', name: 'Route', positions: track.slice(-256) }] : [] } } };
}

Bir hücredeki liste en fazla 256 öğe tutar, bu nedenle bir rotayı 256 noktayla sınırlı tutun. Bkz. Map cards.

İyi uygulamalar

  • Yalnızca değiştirdiğiniz yuvaları döndürün.
  • Eksik verilere karşı koruyun: cihaz sessiz olduğunda bir yuva boş olabilir.
  • Betikleri küçük ve hızlı tutun; bir yıllık ham okumalar üzerindeki uzun bir döngü zaman bütçesini aşar. Toplu veri sağlayan bir kaynağı tercih edin.
  • Zamana dayalı her şey için Date.now() yerine now kullanın.