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
- Panoyu özelleştirin ve kartın ayarlarını açın.
- Veri sekmesinde Gelişmiş: değerleri bir betikle hesapla bölümünü açın.
- Bu betiği çalıştır kutusunu işaretleyin ve Betik alanını yazın.
- 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”.
- Zaman bütçesi (ms) ve Çalıştırma başarısız olduğunda değerlerini ayarlayın.
- 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çim | Form |
|---|---|
| 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ır | Değer |
|---|---|
| Betik uzunluğu | 65.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 yuvalar | 16 |
| Tablo başına satır | 5,000 |
| Sütunlar | 64 |
| Bir metin değeri | 10 KiB |
| Tüm sonuç | 2 MiB |
| Bir sahnedeki nesneler | Sü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ğunda | Kart |
|---|---|
| Önceki sonucu koru | Son başarılı çıktıyı korur ve Transform failed rozetini gösterir |
| Kartı boş göster | Verinin 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()yerinenowkullanın.

