İçeriğe geç

Script API

Script API; diğer script’leri zamanlayıcıya bağlama / çıkarma, anında çalıştırma, durum sorgulama ve script’ler arası veri paylaşmak için kullanılır. Paylaşımlı veri katmanı Redis üzerinden tutulur ve proje-scoped’tur.

Bir script’in tanımını döner — RepeatableScriptResponseDto.

var s = ins.getScript("HourlyReport");
ins.consoleLog(s.getName() + " type=" + s.getType() + " period=" + s.getPeriod() + "ms");

Alanlar:

MetodTürAçıklama
getName() / getDsc()StringScript adı ve açıklama
getCode()StringJavaScript kaynak kodu
getType()ScheduleTypePERIODIC / DAILY / ONCE / NONE
getPeriod()IntegerPeriodic tipi için ms cinsinden periyot
getOffset()IntegerPeriodic için ms cinsinden offset
getDelay()IntegerOnce tipi için gecikme (ms)
getTime()DateDaily için tetikleme saati
getLog()BooleanÇalıştırma log’u aktif mi
getProjectId()StringProje ID

ins.getScriptStatus(name) / (projectName, name)

Section titled “ins.getScriptStatus(name) / (projectName, name)”

ScriptStatus enum döner — iki değer:

DeğerAnlam
"Scheduled"Zamanlayıcıya bağlı
"Not Scheduled"Bağlı değil (manuel çalıştırılabilir)
if (ins.getScriptStatus("HourlyReport") == "Not Scheduled") {
ins.scheduleScript("HourlyReport");
}

ins.scheduleScript(name) / (projectName, name)

Section titled “ins.scheduleScript(name) / (projectName, name)”

Script’i tanımındaki ScheduleType’a göre zamanlayıcıya ekler. type=NONE olan script’lere etkisi yoktur.

ins.scheduleScript("HourlyReport");

ins.cancelScript(name) / (projectName, name)

Section titled “ins.cancelScript(name) / (projectName, name)”

Script’i zamanlayıcıdan çıkarır — kalan tetiklemeler iptal edilir, ama o sırada çalışan bir execution kesilmez (mevcut execution doğal sonuna kadar gider).

ins.cancelScript("HourlyReport");

ins.executeScript(name) / (projectName, name)

Section titled “ins.executeScript(name) / (projectName, name)”

Script’i anında çalıştırır ve döndürdüğü değeri döner. Senkron çalışır — script bitene kadar blocker.

var dailyTotal = ins.executeScript("Calculate_DailyTotal");
ins.setVariableValue("DailyProduction_kWh", { value: dailyTotal });

Global Object — Script’ler Arası Paylaşım

Section titled “Global Object — Script’ler Arası Paylaşım”

Script’ler birbirinden izole çalışır (paylaşımlı memory yoktur). Bunu aşmak için setGlobalObject / getGlobalObject ikilisi Redis tabanlı bir anahtar-değer deposu sunar. Anahtarlar proje-scoped’tır (project:<projectId>:global-object:<name>).

Objeyi süresiz (TTL yok) saklar.

ins.setGlobalObject("daily_counter", 42);
ins.setGlobalObject("shift_data", {
shift: "A",
count: 150,
startTime: ins.now().toString()
});

Objeyi TTL ile saklar — ms milisaniye sonra otomatik silinir (Redis SET PX).

// 60 saniye sonra silinecek cache
ins.setGlobalObject("temp_cache", { value: 99 }, 60000);

Objeyi döner; yoksa null. TTL’e dokunmaz.

var counter = ins.getGlobalObject("daily_counter");
// → 42 veya null

Objeyi döner ve aynı anda TTL’i ms’e resetler (sliding TTL — Redis PEXPIRE). Tipik kullanım: “Her okuma objeyi canlı tutsun.”

// Oturum gibi davranan veri: her okuma 5 dk canlılık ekler
var session = ins.getGlobalObject("user_session", 5 * 60 * 1000);
// Backend script (her 10 sn):
function main() {
ins.setGlobalObject("dashboard_summary", {
power: ins.getVariableValue("ActivePower_kW").value,
voltage: ins.getVariableValue("Voltage_V").value,
updatedAt: ins.now().getTime()
}, 30000); // 30 sn TTL — veri "stale" olmasın
}
main();

UI tarafındaki custom HTML widget, client-side Inscada.* ile aynı anahtara okuma yapabilir.

function main() {
var last = ins.getGlobalObject("report_last_run");
var now = ins.now().getTime();
if (last && (now - last) < 3600000) {
ins.consoleLog("1 saat dolmadı, atla");
return;
}
ins.executeScript("generate_hourly_report");
ins.setGlobalObject("report_last_run", now);
}
main();
function main() {
if (ins.getGlobalObject("maintenance_mode")) {
ins.consoleLog("Bakım modu, script atlandı");
return;
}
// normal iş...
}
main();