Neu: Die KI-Firewall überwacht jedes Modul und erklärt jeden Vorfall in einfachen Worten. So funktioniert es

Rechenskripte

Formen Sie die Daten einer Karte mit einer kleinen, abgeschirmten JavaScript-Funktion um – der Vertrag, was sie darf und was nicht, Grenzen, Fehlerbehandlung und ausgearbeitete Beispiele.

Ein Rechenskript (in den Einstellungen der Karte als Transform angezeigt) ist eine kleine JavaScript-Funktion, die aus den geladenen Daten ableitet, was eine Karte darstellt. Verwenden Sie es, wenn keine Quelle genau die gewünschte Form liefert: Einheiten umrechnen, zwei Reihen zu einer Route verbinden, Zeilen zählen oder den schlechtesten Status auswählen. Ein Skript rechnet nur. Es kann keinen Parameter setzen, keinen Befehl ausführen, keine Seite öffnen und nicht auf das Netzwerk zugreifen.

Skript hinzufügen

  1. Passen Sie das Board an und öffnen Sie die Einstellungen der Karte.
  2. Öffnen Sie auf der Registerkarte Daten den Bereich Erweitert: Werte mit einem Skript berechnen.
  3. Aktivieren Sie Dieses Skript ausführen und schreiben Sie das Skript.
  4. Wählen Sie Jetzt ausführen, um Ihren Entwurf auf den aktuellen Daten der Karte auszuführen. Das Ergebnis listet die Rückgabe je Slot auf, zum Beispiel „series: table, 12 row(s)“ und „ran in 3 ms“.
  5. Legen Sie das Zeitbudget (ms) und Wenn ein Lauf fehlschlägt fest.
  6. Wählen Sie Speichern.

Skript entfernen löscht es. Das Skript wird mit der Karte kopiert, wandert mit Board-Dateien und bleibt auf der Karte erhalten, wenn Sie sie als Widget speichern.

Der Vertrag

Das Skript ist ein ES-Modul, dessen Standardexport eine synchrone Funktion ist:

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 */ } };
}

Sie gibt { slots } zurück. Jeder zurückgegebene Slot ersetzt den geladenen; Slots, die Sie nicht zurückgeben, bleiben wie geladen. Ein leeres Ergebnis stellt die Daten wie geladen dar.

FormForm
Skalar{ shape: 'scalar', value: 21.5, meta: { unit: '°C', decimals: 1 } }
Reihe{ shape: 'series', series: [{ name: 'temperature', points: [{ t: '2026-11-09T10:00:00Z', v: 21.5 }] }] }
Tabelle{ shape: 'table', columns: [{ key: 'id' }, { key: 'value', type: 'number' }], rows: [{ id: 'p1', value: 3 }] }
Datensatz{ shape: 'record', record: { level: 2.4, flow: 18 } }

Eine Prozessdiagramm- oder 3D-Modell-Karte kann außerdem scene zurückgeben: Objekte, objektbezogene Überschreibungen, zusätzliche Verbindungen und Zonen, die Ansicht und Probleme. Es verändert nur die Darstellung.

Wo es läuft

Das Skript läuft in Ihrem Browser, in einem verborgenen Frame ohne Zugriff auf Hermetry, das Netzwerk oder Ihre Sitzung, in einem eigenen Worker. Es läuft erneut, wenn sich die Daten der Karte ändern (auch ein Live-Update) oder ein Parameter ändert. Pro Karte ist jeweils ein Lauf aktiv; die neueste Eingabe gewinnt, höchstens 20 Läufe pro Sekunde. Eine nicht angezeigte Karte wird nicht ausgeführt. Anzeigebildschirme führen Skripte auf dieselbe Weise aus.

Grenzen

GrenzeWert
Skriptlänge65.536 Zeichen
Zeitbudget10 bis 500 ms pro Lauf, Standard 50. Darüber hinaus wird der Lauf gestoppt.
Zurückgegebene Slots16
Zeilen pro Tabelle5,000
Spalten64
Ein Textwert10 KiB
Gesamtes Ergebnis2 MiB
Objekte in einer Szene500 auf einem Prozessdiagramm, 2.000 auf einem 3D-Modell

Wenn ein Lauf fehlschlägt

Wenn ein Lauf fehlschlägtDie Karte
Vorheriges Ergebnis behaltenBehält die letzte gültige Ausgabe bei und zeigt ein Abzeichen Transform fehlgeschlagen
Karte leer anzeigenZeigt den Fehler an Stelle der Daten

Meldungen: „Das Skript hat sein Zeitbudget überschritten: …“, „Das Skript konnte nicht geladen werden: …“, „Transform fehlgeschlagen: …“.

Beispiele

Celsius in Fahrenheit auf einer Kennzahlkarte (Slot 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 } } } };
}

Offene Alarme der Geräte eines Parameters zählen (eine Kennzahlkarte, deren Slot value an Alarme (live) gebunden ist, eine Tabelle):

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 } } } };
}

Eine Route aus Breiten- und Längengrad-Reihen (eine Karte, deren Slot routes an Gerätemesswerte über Zeit mit den Schlüsseln lat,lng gebunden ist):

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) }] : [] } } };
}

Eine Liste innerhalb einer Zelle enthält höchstens 256 Einträge, halten Sie eine Route daher auf 256 Punkte. Siehe Map-Karten.

Gute Praxis

  • Geben Sie nur die Slots zurück, die Sie ändern.
  • Prüfen Sie auf fehlende Daten: Ein Slot kann leer sein, während das Gerät keine Meldung sendet.
  • Halten Sie Skripte klein und schnell; eine lange Schleife über ein Jahr Rohmesswerte überschreitet das Zeitbudget. Bevorzugen Sie eine Quelle mit Aggregat.
  • Verwenden Sie für alles Zeitabhängige now, niemals Date.now().