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

Hesaplama betikleri

Bir kartın verisini küçük, korumalı alanda çalışan bir JavaScript fonksiyonuyla yeniden biçimlendirin – sözleşme, neler yapabileceği ve yapamayacağı, sınırlar, hata yönetimi ve örnekler.

Bir hesaplama betiği (kartın ayarlarında Transform olarak görünür), bir kartın çizeceği değeri yüklenen verilerden türeten küçük bir JavaScript fonksiyonudur. Hiçbir kaynak tam istediğiniz biçimi vermediğinde kullanın: birimleri dönüştürmek, iki seriyi bir rota olarak eşleştirmek, satırları saymak veya en kötü durumu seçmek için. Betik yalnızca hesaplama yapar. Bir parametre ayarlayamaz, 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 seçeneğini 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ı, yuvalar bazında geri dönen değerleri listeler; örneğin “series: table, 12 row(s)” ve “ran in 3 ms”.
  5. Zaman bütçesi (ms) ve Bir çalıştırma başarısız olduğunda ayarlarını yapı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 */ } };
}

Betik { slots } döndürür. Döndürülen her yuva, yüklenen yuvanın yerini alır; 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 proses 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 veya oturumunuza erişimi olmayan gizli bir çerçevede, kendi çalışanı (worker) içinde çalışır. Kartın verisi her değiştiğinde (canlı güncelleme dahil) veya 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çerlidir 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
Tek bir metin değeri10 KiB
Tüm sonuç2 MiB
Bir sahnedeki nesnelerProses diyagramında 500, 3B modelde 2.000

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

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

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

Örnekler

Bir stat kartında Celsius’tan Fahrenheit’a (yuva value):

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 (value yuvası Alarms (live) tablosuna bağlı bir stat 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 kaynağına 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 bir liste en fazla 256 öğe içerir, bu yüzden 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 sessizken bir yuva boş olabilir.
  • Script’leri küçük ve hızlı tutun; bir yıllık ham okuma üzerinde uzun bir döngü zaman bütçesini aşar. Toplulaştırılmış verisi olan bir kaynağı tercih edin.
  • Zamana dayalı işlemler için Date.now() yerine her zaman now kullanın.