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

Script bloğu

Akışta kendi JavaScript kodunuzu çalıştırın – kodun neyi görüp döndürdüğü, bağlam, yardımcılar, sınırlar, hatalar, test ve çalışmış örnekler.

Blok Script (JavaScript) kodunuzu her mesajda çalıştırır. Diğer bloklar istediğiniz şeyi ifade edemediğinde kullanın: alışılmadık bir ikili biçimi çözmek, bir liste üzerinde döngü kurmak, karmaşık bir nesne oluşturmak. Uygun olduğunda hazır blokları tercih edin: daha kolay okunurlar, script kotası gerektirmezler ve daha hızlı çalışırlar.

Ayarlar

AyarAnlamıVarsayılanDeğerler
kodScriptbir örnekzorunlu; en fazla 64 KiB
çıkışlarÇıkış sayısı11 ile 4 arası (o0 ile o3)
etiketlerÇıkış adları, virgülle ayrılmışboşharfler, rakamlar, _, boşluk ve -; çıkış başına bir tane, hepsi farklı

Yayınlanmış bir akıştaki her script bloğu, planınızın Script blokları hakkından (IoT kademesine göre 3, 6 veya 29) sayılır. İçinde script bulunan bir yayın bir Code riskli yayındır: akışın adının yazılmasını ister ve denetlenir (“Script changed”).

Kodun gördükleri

Düzenleyici, kod alanının üzerinde imzayı gösterir: msg, node, context, flow, global, env → return msg | [a, b] | [[a, b]] | "label" | nothing.

AdNedir
msgMesaj, değiştirebileceğiniz bir kopyadır. msg.metadata sistem alanları dışında yazılabilir; msg.msgType ve msg.originator salt okunurdur.
node.send(msg)Mesajı hemen çıkış 1 üzerinden gönderir (node.send([a, b]), return gibi çıkışları seçer)
node.status({ fill, shape, text })Bloğun altında gösterilen durum
node.warn(value), node.error(text)Bloğun günlüğüne yazar
context.get("key"), context.set("key", value)Bu bloğa ait bir depo
flow.get(…), flow.set(…)Akışın değişkenleri; diğer bloklardaki flow.* yollarıyla paylaşılır
global.get(…), global.set(…)Kuruluşun değişkenleri (global.*)
env.get(name)Bir ortam değeri
console.log(value)node.warn ile aynı günlük

Kalıcı depo için persist:name anahtarını kullanın, örneğin flow.set("persist:total", 12). Bir anahtarı undefined yapmak onu siler.

Bağlam yazmaları script çalıştıktan sonra uygulanır. Bir deponun sınırını aşan ilk yazma kalanları durdurur ve mesaj limit ile error çıkışından ayrılır; önceki yazmalar kalır.

Ne döndürebilir

DönüşEtkisi
return msgMesajı çıkış 1 üzerinden gönderir
return [a, b]a çıkış 1’e, b çıkış 2’ye (en fazla 4); null o çıkışa hiçbir şey göndermez
return [[a, b]]İkisi de çıkış 1’e
return "alarm"Gelen mesaj, alarm etiketli çıkışa gider
Hiçbir şey (undefined, null, [])Hiçbir şey gönderilmez; mesaj burada durur

Çalıştırma başına en fazla 64 mesaj. return { payload: 1 } gibi yeni bir nesne girdiden tamamlanır; bir motor alanını başka bir değere ayarlayan nesne readonly_field ile başarısız olur.

Yardımcılar

Ad alanıİşlevler
bytesfromHex, toHex, fromBase64, toBase64, sha256, toText, fromText, readUint, readInt, readFloat, writeUint, writeInt, writeFloat; ayrıca TextEncoder, TextDecoder
numround(value, digits), toHex(value, { bytes, bigEndian, prefix })
bitsfromBytes, fromInt, toInt, get
objflatten(value, { separator, exclude, pathInKey })
timeparse, format, add, fields; yyyy-MM-dd HH:mm:ss gibi kalıplar ve IANA bölgeleriyle

Kullanılamaz: require, import(), eval, Function, fetch, zamanlayıcılar (bir Delay bloğu kullanın), process, Buffer, WebAssembly. Script ağa, dosyalara ve kimlik bilgilerine erişemez. Date gerçek saattir.

Sınırlar

SınırDeğer
Mesaj başına CPU süresi50 ms (planınız 200 ms’ye kadar izin verebilir)
Bellek32 MiB
Kod64 KiB
Döndürülen mesajlar64
Giren veya çıkan mesaj boyutu256 KiB
Girilen bağlam64 KiB

Arka arkaya üç sonlandırma (timeout veya memory) script’i 60 saniye engeller: bu sürede mesajlar çalıştırılmadan blocked ile başarısız olur. Her çalıştırmanın CPU süresi, kullanım kartındaki ayın Script CPU değerine eklenir.

Hatalar

error çıkışı msg.error.code taşır:

KodAnlamı
scriptKod hata fırlattı; line ve col nerede olduğunu gösterir
timeout, memoryCPU süresi veya bellek aşıldı
limit64’ten fazla mesaj döndürüldü veya bir bağlam yazması sınırını aştı
msg_too_big256 KiB’yi aşan bir mesaj
unknown_labelHiçbir çıkışta olmayan bir etiket döndürüldü
bad_returnMesaj, liste veya etiket olmayan (ya da bir promise) bir değer döndürüldü
readonly_fieldmsgType, originator veya bir sistem alanı değiştirildi
blockedÜç sonlandırmadan sonra duraklatıldı
host_busyBirkaç denemeden sonra da sandbox meşgul kaldı
script_unavailableScript hizmeti kullanılamıyor

Script’i test edin

Blok panelindeki Test the script, kodu gerçek sandbox üzerinde bir kez çalıştırır: “Hiçbir şey yayınlanmaz; Save kodu bloğa koyar.” Payload (JSON), Metadata (JSON object), Message type, Originator type ve Originator id alanlarını doldurun, isteğe bağlı olarak Context (optional JSON) alanına { "node": {…}, "flow": {…}, "global": {…} } biçiminde yazın ve Run seçin. Sonuçta her çıkış, günlük, yazılan bağlam ve CPU süresi görünür. Save into the block kodu korur.

Örnekler

Ham hex yükünden 4 baytlık bir float çözün:

const data = bytes.fromHex(msg.payload.raw_hex);
msg.payload = { level_m: num.round(bytes.readFloat(data, 0, 4, { bigEndian: true }), 3) };
return msg;

Birden çok sensör içeren bir mesajı sensör anahtarı başına bir okumaya bölün:

// in: { "sensors": [ { "id": "t1", "v": 21.5 }, { "id": "t2", "v": 19.0 } ] }
const out = {};
for (const s of msg.payload.sensors || []) out[`temp_${s.id}`] = s.v;
msg.payload = out; // { temp_t1: 21.5, temp_t2: 19 }
return msg;

Hesaplanan bir sınıfa göre etiketli çıkışlara yönlendirin (etiketler ok,warn,crit):

const t = msg.payload.temperature;
if (typeof t !== 'number') return null;
return t > 8 ? 'crit' : t > 6 ? 'warn' : 'ok';

Mesajlar boyunca çalışan bir toplam tutun:

const total = (flow.get('persist:litres_total') || 0) + (msg.payload.litres || 0);
flow.set('persist:litres_total', total);
msg.payload.litres_total = total;
return msg;

Script ne zaman kullanılmamalı

İhtiyaçBunun yerine kullanın
Bir formülCalculate
Anahtarları yeniden adlandırma, kopyalama veya silmeChange
İkili alanlarBytes
Bir değere göre dallanmaSwitch veya If / else
Bir sayaçtan tüketimDelta
BeklemeDelay, Trigger, Timer

Bkz. Data transform blocks ve Flow limits.