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
- 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 seçeneğini 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ı, yuvalar bazında geri dönen değerleri listeler; örneğin “series: table, 12 row(s)” ve “ran in 3 ms”.
- Zaman bütçesi (ms) ve Bir çalıştırma başarısız olduğunda ayarlarını yapı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 */ } };
}
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ç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 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ı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 |
| Tek bir metin değeri | 10 KiB |
| Tüm sonuç | 2 MiB |
| Bir sahnedeki nesneler | Proses 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ğunda | Kart |
|---|---|
| Önceki sonucu koru | Son başarılı çıktıyı tutar ve bir Transform failed rozeti gösterir |
| Kartı boş göster | Verinin 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 zamannowkullanın.

