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
| Ayar | Anlamı | Varsayılan | Değerler |
|---|---|---|---|
| kod | Script | bir örnek | zorunlu; en fazla 64 KiB |
| çıkışlar | Çıkış sayısı | 1 | 1 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.
| Ad | Nedir |
|---|---|
msg | Mesaj, 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 msg | Mesajı çı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 |
|---|---|
bytes | fromHex, toHex, fromBase64, toBase64, sha256, toText, fromText, readUint, readInt, readFloat, writeUint, writeInt, writeFloat; ayrıca TextEncoder, TextDecoder |
num | round(value, digits), toHex(value, { bytes, bigEndian, prefix }) |
bits | fromBytes, fromInt, toInt, get |
obj | flatten(value, { separator, exclude, pathInKey }) |
time | parse, 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ır | Değer |
|---|---|
| Mesaj başına CPU süresi | 50 ms (planınız 200 ms’ye kadar izin verebilir) |
| Bellek | 32 MiB |
| Kod | 64 KiB |
| Döndürülen mesajlar | 64 |
| Giren veya çıkan mesaj boyutu | 256 KiB |
| Girilen bağlam | 64 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:
| Kod | Anlamı |
|---|---|
script | Kod hata fırlattı; line ve col nerede olduğunu gösterir |
timeout, memory | CPU süresi veya bellek aşıldı |
limit | 64’ten fazla mesaj döndürüldü veya bir bağlam yazması sınırını aştı |
msg_too_big | 256 KiB’yi aşan bir mesaj |
unknown_label | Hiçbir çıkışta olmayan bir etiket döndürüldü |
bad_return | Mesaj, liste veya etiket olmayan (ya da bir promise) bir değer döndürüldü |
readonly_field | msgType, originator veya bir sistem alanı değiştirildi |
blocked | Üç sonlandırmadan sonra duraklatıldı |
host_busy | Birkaç denemeden sonra da sandbox meşgul kaldı |
script_unavailable | Script 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ül | Calculate |
| Anahtarları yeniden adlandırma, kopyalama veya silme | Change |
| İkili alanlar | Bytes |
| Bir değere göre dallanma | Switch veya If / else |
| Bir sayaçtan tüketim | Delta |
| Bekleme | Delay, Trigger, Timer |
Bkz. Data transform blocks ve Flow limits.

