ℹ️ Verfügbar ab QuickHMI 15 (Ultimate-Lizenz). Diese Version ist noch nicht veröffentlicht.
Serverseitige Skripte reagieren auf Ereignisse des Servers. Sie registrieren dazu eine Funktion, die der Server aufruft, sobald das Ereignis eintritt. Alle Handler laufen nacheinander in einem eigenen Ablauf; Ihr Code muss sich also nicht gegen gleichzeitige Aufrufe absichern.
Wertänderungen
qhmi.onVarChanged(name, handler)
Wird aufgerufen, sobald sich der Wert oder die Quality einer Variablen ändert. Statt eines Namens können Sie einen regulären Ausdruck angeben, dann gilt der Handler für alle passenden Variablen. Hat die Variable beim Registrieren bereits einen gültigen Wert, wird Ihr Handler sofort einmal mit dem aktuellen Stand aufgerufen, genau wie im Browser. Sie können mehrere Handler auf dieselbe Variable legen.
qhmi.onVarChanged("SPS.Kessel_Temp", function (args) {
qhmi.log(args.variable.name + ": "
+ args.variable.lastvalue + " -> " + args.variable.value
+ " (" + args.variable.quality + ")");
});
//Mehrere Variablen auf einmal über einen regulären Ausdruck
qhmi.onVarChanged(/^SPS\./, function (args) {
//...
});
// args.variable enthält:
// { datasource_name, name, value, lastvalue, quality, timestamp, datatype }
Serverstart und Serverstopp
qhmi.onServerStarted(handler), qhmi.onServerStopped(handler)
onServerStarted feuert einmal je Serverlauf, nachdem alle Skripte geladen und die Datenquellen bereit sind. Es ist der richtige Ort für alles, was gültige Werte voraussetzt. onServerStopped feuert beim geordneten Herunterfahren, bevor die Datenquellen getrennt werden. Wird der Serverprozess hart beendet, läuft kein Skript mehr.
qhmi.onServerStarted(function () {
qhmi.log("Server bereit, Datenquellen initialisiert");
});
qhmi.onServerStopped(function () {
qhmi.storage.set("letzterStopp", Date.now());
});
Datenquellen
qhmi.onDatasourceStatusChanged(handler)
Wird aufgerufen, wenn eine Datenquelle ihren Zustand wechselt, etwa bei Verbindungsverlust und Wiederkehr. Zwischenmeldungen ohne echten Wechsel lösen das Ereignis nicht aus.
qhmi.onDatasourceStatusChanged(function (args) {
if (args.datasource.quality !== "GOOD") {
qhmi.sendMail("Stoerung", "", "Datenquelle gestört",
args.datasource.name + ": " + args.datasource.message);
}
});
// args.datasource: { name, quality, message }
Alarme
qhmi.onAlarm(handler), qhmi.onAlarmAcknowledged(handler)
onAlarm meldet kommende und gehende Alarme; das Feld coming unterscheidet beides. onAlarmAcknowledged meldet Quittierungen mit Benutzer und Quelle.
qhmi.onAlarm(function (args) {
qhmi.log((args.alarm.coming ? "kommt: " : "geht: ") + args.alarm.variable
+ " [" + args.alarm.alarmclass + "] " + args.alarm.message);
});
qhmi.onAlarmAcknowledged(function (args) {
qhmi.log(args.alarm.variable + " quittiert von " + args.alarm.user);
});
// args.alarm bei onAlarm:
// { variable, datasource_name, name, alarmclass, message, location, coming, timestamp }
Visualisierungen und Benutzer
qhmi.onClientConnected(handler), qhmi.onClientDisconnected(handler)
Melden das Öffnen und Schließen einer Visualisierung. Ohne aktives Sicherheitssystem bleibt user leer. Beachten Sie, dass ein einfach geschlossener Browser sich nicht abmeldet: onClientDisconnected kommt dann erst, wenn die Sitzung abgelaufen ist.
qhmi.onClientConnected(function (args) {
qhmi.log("Verbunden: " + args.session.id
+ (args.session.user ? " als " + args.session.user : ""));
});
// args.session: { id, user }
qhmi.onUserLoggedIn(handler), qhmi.onUserLoggedOut(handler)
Melden An- und Abmeldungen. Sie setzen ein aktives Sicherheitssystem voraus, denn ohne Benutzer gibt es keine Anmeldung.
qhmi.onUserLoggedIn(function (args) {
qhmi.log("Anmeldung: " + args.session.user);
});
Zeitpläne
qhmi.onSchedule(uhrzeit, wochentage, handler)
Ruft Ihre Funktion zur angegebenen Uhrzeit auf, wahlweise nur an bestimmten Wochentagen. Die Uhrzeit gilt in der Zeitzone des Servers. Verpasste Zeitpunkte werden nicht nachgeholt: Lief der Server um 06:00 nicht, passiert an diesem Tag nichts.
//Täglich um 6 Uhr
qhmi.onSchedule("06:00", function () {
qhmi.sendMailTemplate("Tagesbericht");
});
//Nur montags bis freitags, 1 = Montag bis 7 = Sonntag
qhmi.onSchedule("07:30", [1, 2, 3, 4, 5], function () {
qhmi.setVariable("SPS.Schichtbeginn", true);
});
Timer
setInterval(funktion, ms), setTimeout(funktion, ms)
Die aus dem Browser bekannten Timer stehen auch serverseitig zur Verfügung, samt clearInterval und clearTimeout. Der Abstand bei setInterval zählt vom Ende des letzten Laufs bis zum Beginn des nächsten. Ein langsamer Durchlauf staut also keine Nachholläufe auf, verschiebt die folgenden Zeitpunkte aber nach hinten.
const timer = setInterval(function () {
qhmi.setVariable("SPS.Lebenszeichen", Date.now());
}, 5000);
//Später wieder abschalten
clearInterval(timer);
