Zum Inhalt springen
JelinaJelina DocumentationTechnische Dokumentation
Zur Website

Vollständige Lua-Skriptreferenz

Diese Seite ist die vollständige Referenz der Skriptfunktionen der Ausdrucksengine von Edge-EMS Builder für Aggregationsausdrücke, Trigger-Bedingungen und -Aktionen, Nachverarbeitungsaktionen sowie MQTT-Publish-/Subscribe-Inhalte. Die Skripte verwenden Lua 5.x und werden von der integrierten Lua-Laufzeit interpretiert und ausgeführt. Lesen Sie zum Einstieg die Ausdrucksengine. Diese Seite ergänzt alle integrierten Module, Signaturen globaler Funktionen und Rückgabekonventionen.

⚠️ Falls Sie mit der früheren Java-Version von Edge-EMS Builder vertraut sind (QLExpress4-Engine mit Java-ähnlicher Syntax): Die Variablenreferenz ${...} bleibt weitgehend unverändert, die Skriptsyntax wurde jedoch auf Standard-Lua umgestellt. Beispielsweise wird new ArrayList() zu {}, .add(x) zu table.insert(t, x), new HashMap() zu {} und .put(k, v) zu t[k] = v. Die meisten Namen integrierter Funktionen bleiben erhalten. Verwenden Sie diese Seite als Migrationsreferenz.

  • Skriptsprache: Lua 5.x; Funktionsnamen und Platzhalter unterscheiden zwischen Groß- und Kleinschreibung.
  • Datenplatzhalter: Die Engine ersetzt ${dataKey} vor der Skriptausführung durch den aktuellen Wert. Geräteübergreifende Referenzen verwenden ${[deviceCode]dataKey}.
  • Sentinel-Wert: Sind Daten nicht verfügbar, wird der String __Null__ eingesetzt. Prüfen Sie ihn durch expliziten Vergleich oder mit isNull / isNotNull. Verwenden Sie vor numerischen Berechnungen tonumber.
  • Rückgabewerte sind kontextabhängig (siehe „Rückgabekonventionen“ unten). Ein falscher Rückgabetyp ist eine der häufigsten Ursachen für Konfigurationsfehler.
  • Modulfunktionen erfordern zuerst require("Modulname"). Globale Funktionen wie buildCommonWriteMap und jsonToMap werden direkt ohne require aufgerufen.
  • Protokollierung: Das Modul Logger verwendet standardmäßig die Stufe WARN. Nur Logger.warn() und Logger.error() erzeugen tatsächlich Ausgaben. Verwenden Sie beim Debuggen nicht ausschließlich Logger.info() oder Logger.debug().
Syntax Beschreibung
${variable} Gibt den aktuellen Wert zurück
${variable[-1s]} Gibt den Wert der vorherigen Sekunde zurück
${variable[-5s]} Gibt den Wert von vor 5 Sekunden zurück
${variable[raw]} Übergibt den Wert unverändert ohne automatische Typkonvertierung. Bei schwer unterscheidbaren Werten wie der Zahl 1000 und dem Binärwert 1000 steuert raw die unveränderte Übergabe. [raw] muss ausschließlich an letzter Stelle stehen.
${[deviceA]variable} Gibt den Wert des freigebenden Geräts deviceA zurück
${variable[@timestamp]} Gibt den Wert zum angegebenen absoluten Zeitpunkt zurück
${variable[#N]} Gibt den N-ten Wert vom Ende der Historie zurück; ohne diese Regel wird standardmäßig der neueste Wert zurückgegeben
${[deviceA]variable[-5s][#N]} Gibt den N-ten Messwert vom Ende für das freigebende Gerät deviceA zum Zeitpunkt vor 5 Sekunden zurück

Ist für den Zieldatenpunkt kein Wert verfügbar, setzt die Engine den Sentinel-String __Null__ ein. Prüfen Sie diesen im Skript ausdrücklich, beispielsweise mit if ${some_key} == "__Null__" then ... end.

Die Anforderungen an den Rückgabewert unterscheiden sich je nach Eingabefeld grundlegend. Hier treten besonders häufig Fehler auf:

Kontext Eingabestelle Erforderlicher Rückgabewert
Trigger-Bedingung Bedingungsausdruck Ein einzelner boolescher Wert (true = Bedingung erfüllt)
Trigger-Aktion eines Ausdrucks-Triggerschemas Aktionsinhalt (Expression) Eine Array-Tabelle mit fortlaufenden Indizes ab 1. Die Elemente sind von buildCommonWriteMap(...) oder ähnlichen Funktionen zurückgegebene Maps. Die leere Tabelle {} bedeutet „keine Schreibelemente“
Trigger-Aktion eines Triggerschemas mit gemischten Schreibvorgängen Separat an jeden dataKey gebundene Aktion Ein einzelner Wert (String, Zahl oder Boolean), der in diesen dataKey geschrieben wird. Kein Array aus buildCommonWriteMap-Ergebnissen zurückgeben
Nachverarbeitungsaktion Abschließendes Skript nach Ausführung der Trigger-Aktion Wie bei einer Ausdrucks-Trigger-Aktion: eine Array-Tabelle mit Schreibbeschreibungen. Die festen Variablen ${trigger_result} (Boolean) und ${trigger_write_result} (JSON-String, mit jsonToMap zu parsen) geben Auskunft über das Ergebnis des Hauptablaufs
Ausdruck eines Aggregationsdatenpunkts Berechnungsausdruck für Aggregationsdaten Ein einzelner Wert (Zahl, String usw.), der als neuester Wert des Aggregationsdatenpunkts verwendet wird
MQTT-Publish-Inhalt (publishContent) MQTT-Publish-Konfiguration Eine Lua-Tabelle, die als Publish-Nutzlast in JSON serialisiert wird
MQTT-Subscribe-Aktion (actionContent) MQTT-Subscribe-Konfiguration Wie bei einer Ausdrucks-Trigger-Aktion: eine Array-Tabelle mit Schreibbeschreibungen
MQTT-Antwort-Topic (responseTopic) MQTT-Subscribe-Konfiguration Ein einzelner String, der als Topic für die Antwortveröffentlichung verwendet wird
MQTT-Antwortinhalt (response) MQTT-Subscribe-Konfiguration Strings werden unverändert gesendet; andere Werte wie Lua-Tabellen werden in JSON serialisiert

Für jeden Skriptaufruf gilt ein Ausführungszeitlimit (standardmäßig 10 Sekunden; bei Überschreitung schlägt die Ausführung fehl). Vermeiden Sie unbeschränkte historische Datenabfragen oder HTTP-Anfragen in Schleifen.

Die folgenden Module müssen vor ihrer Verwendung mit require("Modulname") geladen werden:

Umfassendes Modul zur Verarbeitung von Datum und Uhrzeit mit Zeitzonen, Formatierung und Berechnungen.

local OffsetDateTime = require("OffsetDateTime")
Methode Beschreibung Rückgabewert
new() Aktuellen Zeitpunkt erzeugen OffsetDateTime
new(sec, nsec?) Aus einem Unix-Zeitstempel erzeugen OffsetDateTime
now() Aktuellen Zeitpunkt abrufen OffsetDateTime
parse(str) Zeit-String parsen OffsetDateTime | (nil, err)
parseInLocation(str, location) Zeit in der angegebenen Zeitzone parsen OffsetDateTime | (nil, err)
unix(sec, nsec?) Aus Unix-Sekunden erzeugen OffsetDateTime
unixMilli(msec) Aus einem Millisekunden-Zeitstempel erzeugen OffsetDateTime
unixMicro(usec) Aus einem Mikrosekunden-Zeitstempel erzeugen OffsetDateTime
Methode Beschreibung Rückgabewert
year() Jahr abrufen number
month() Monat abrufen (1–12) number
day() Tag des Monats abrufen (1–31) number
hour() Stunde abrufen (0–23) number
minute() Minute abrufen (0–59) number
second() Sekunde abrufen (0–59) number
nanosecond() Nanosekunden abrufen number
yearDay() Tag des Jahres abrufen number
weekday() Wochentag abrufen (0 = Sonntag) number
isoWeek() ISO-Kalenderwoche abrufen {year, week}
date() Jahr, Monat und Tag abrufen {year, month, day}
clock() Stunde, Minute und Sekunde abrufen {hour, minute, second}
Methode Beschreibung Rückgabewert
add(durationStr) Zeitdauer addieren OffsetDateTime | (nil, err)
addDate(years, months, days) Jahre, Monate und Tage addieren OffsetDateTime
sub(other) Zeitdifferenz in Nanosekunden berechnen number
addYears(n) Jahre addieren OffsetDateTime
addMonths(n) Monate addieren OffsetDateTime
addDays(n) Tage addieren OffsetDateTime
addHours(n) Stunden addieren OffsetDateTime
addMinutes(n) Minuten addieren OffsetDateTime
addSeconds(n) Sekunden addieren OffsetDateTime
addMilliseconds(n) Millisekunden addieren OffsetDateTime
addMicroseconds(n) Mikrosekunden addieren OffsetDateTime
addNanoseconds(n) Nanosekunden addieren OffsetDateTime
Methode Beschreibung Rückgabewert
diffYears(other) Differenz in Jahren berechnen number
diffMonths(other) Differenz in Monaten berechnen number
diffDays(other) Differenz in Tagen berechnen number
diffHours(other) Differenz in Stunden berechnen number
diffMinutes(other) Differenz in Minuten berechnen number
diffSeconds(other) Differenz in Sekunden berechnen number
Methode Beschreibung Rückgabewert
equal(other) Prüft auf Gleichheit boolean
before(other) Prüft, ob der Zeitpunkt früher liegt boolean
after(other) Prüft, ob der Zeitpunkt später liegt boolean
isZero() Prüft auf den Nullwert boolean
Methode Beschreibung Rückgabewert
isToday() Prüft, ob das Datum heute ist boolean
isYesterday() Prüft, ob das Datum gestern war boolean
isTomorrow() Prüft, ob das Datum morgen ist boolean
isThisWeek() Prüft, ob das Datum in dieser Woche liegt boolean
isThisMonth() Prüft, ob das Datum in diesem Monat liegt boolean
isThisYear() Prüft, ob das Datum in diesem Jahr liegt boolean
isBetween(start, end) Prüft, ob der Zeitpunkt im Bereich liegt boolean
isInRange(start, end) Prüft, ob der Zeitpunkt im Bereich liegt boolean
Methode Beschreibung Rückgabewert
format(layout) Benutzerdefinierte Formatierung string
toString() In einen String umwandeln string
toDateTimeString() Datums- und Zeitformat string
toDateString() Datumsformat string
toTimeString() Zeitformat string
toYearString() Jahr string
toMonthString() Monat string
toDayString() Tag des Monats string
toHourString() Stunde string
toMinuteString() Minute string
toSecondString() Sekunde string
Methode Beschreibung Rückgabewert
unix() Unix-Zeitstempel in Sekunden number
unixMilli() Unix-Zeitstempel in Millisekunden number
unixMicro() Unix-Zeitstempel in Mikrosekunden number
unixNano() Unix-Zeitstempel in Nanosekunden number
Methode Beschreibung Rückgabewert
utc() In die Zeitzone UTC umwandeln OffsetDateTime
local() In die lokale Zeitzone umwandeln OffsetDateTime
in(location) In die angegebene Zeitzone umwandeln OffsetDateTime | (nil, err)
Methode Beschreibung Rückgabewert
truncate(durationStr) Auf die angegebene Genauigkeit abschneiden OffsetDateTime | (nil, err)
round(durationStr) Auf die angegebene Genauigkeit runden OffsetDateTime | (nil, err)
toTime() In Go time.Time umwandeln time.Time
local layouts = OffsetDateTime.Layout
-- layouts.DateTime = "2006-01-02 15:04:05"
-- layouts.Date = "2006-01-02"
-- layouts.Time = "15:04:05"
local OffsetDateTime = require("OffsetDateTime")
local Logger = require("Logger")
-- Aktuellen Zeitpunkt abrufen
local now = OffsetDateTime.now()
Logger.warn(now:toString())
-- Zeitpunkt parsen
local dt = OffsetDateTime.parse("2024-01-15T10:30:00.000Z")
Logger.warn("年份: " .. dt:year())
Logger.warn("月份: " .. dt:month())
-- Zeitberechnung
local tomorrow = now:addDays(1)
local nextWeek = now:addDays(7)
Logger.warn("明天: " .. tomorrow:toDateString())
-- Zeitvergleich
if now:isToday() then
Logger.warn("今天!")
end
-- Zeitdifferenz
local hours = nextWeek:diffHours(now)
Logger.warn("相差小时: " .. hours)
-- Formatierung
Logger.warn(now:format("2006-01-02 15:04:05"))
Logger.warn(now:toDateTimeString())

Zeittyp mit Stunde, Minute und Sekunde, ohne Datum und Zeitzone.

local LocalTime = require("LocalTime")
Methode Beschreibung Rückgabewert
new(hour, minute, second) Uhrzeit erzeugen LocalTime | (nil, err)
now() Aktuelle Uhrzeit abrufen LocalTime
parse(str) „HH:mm:ss“ parsen LocalTime | (nil, err)
fromTime(time.Time) Aus time.Time erzeugen LocalTime | (nil, err)
fromDuration(durationStr) Aus einer Zeitdauer erzeugen LocalTime | (nil, err)
Methode Beschreibung Rückgabewert
hour() Stunde abrufen number
minute() Minute abrufen number
second() Sekunde abrufen number
toString() In „HH:mm:ss“ umwandeln string
toDuration() In einen Zeitdauer-String umwandeln string
equal(other) Prüft auf Gleichheit boolean
before(other) Prüft, ob die Uhrzeit früher liegt boolean
after(other) Prüft, ob die Uhrzeit später liegt boolean
beforeOrEqual(other) Prüft, ob die Uhrzeit früher oder gleich ist boolean
afterOrEqual(other) Prüft, ob die Uhrzeit später oder gleich ist boolean
isZero() Prüft auf 00:00:00 boolean
diffSeconds(other) Differenz in Sekunden number
diffMinutes(other) Differenz in Minuten number
diffHours(other) Differenz in Stunden number
addSeconds(n) Sekunden addieren LocalTime
addMinutes(n) Minuten addieren LocalTime
addHours(n) Stunden addieren LocalTime
subSeconds(n) Sekunden subtrahieren LocalTime
subMinutes(n) Minuten subtrahieren LocalTime
subHours(n) Stunden subtrahieren LocalTime
local LocalTime = require("LocalTime")
local Logger = require("Logger")
-- Uhrzeit erzeugen
local workStart = LocalTime.new(9, 0, 0) -- 09:00:00
local workEnd = LocalTime.new(17, 30, 0) -- 17:30:00
-- Aktuellen Zeitpunkt abrufen
local now = LocalTime.now()
Logger.warn("当前时间: " .. now:toString())
-- Zeitvergleich
if now:isBetween(workStart, workEnd) then
Logger.warn("工作时间")
else
Logger.warn("非工作时间")
end
-- Zeitberechnung
local breakTime = workStart:addHours(3):addMinutes(30) -- 12:30:00
Logger.warn("午休时间: " .. breakTime:toString())
-- Zeitdifferenz
local workHours = workEnd:diffHours(workStart)
Logger.warn("工作时长: " .. workHours .. " 小时")

Modul zur Protokollausgabe mit Anbindung an das Systemprotokoll.

local Logger = require("Logger")
Methode Beschreibung Parameter
info(msg) INFO-Protokolleintrag ausgeben string
warn(msg) WARN-Protokolleintrag ausgeben string
error(msg) ERROR-Protokolleintrag ausgeben string
debug(msg) DEBUG-Protokolleintrag ausgeben string
infof(fmt, ...) Formatierten INFO-Protokolleintrag ausgeben string, …
warnf(fmt, ...) Formatierten WARN-Protokolleintrag ausgeben string, …
errorf(fmt, ...) Formatierten ERROR-Protokolleintrag ausgeben string, …
debugf(fmt, ...) Formatierten DEBUG-Protokolleintrag ausgeben string, …
local Logger = require("Logger")
Logger.info("系统启动")
Logger.warn("磁盘空间不足")
Logger.error("数据库连接失败")
Logger.debug("变量值: x=10")
-- Formatierung输出
local user = "admin"
local action = "login"
Logger.infof("用户 %s 执行操作: %s", user, action)
Logger.warnf("重试次数: %s", 3)

Hinweis: Die standardmäßige Protokollierungsstufe von Edge-EMS Builder ist WARN. Nur WARN- und ERROR-Einträge werden ausgegeben.


Modul zur JSON-Serialisierung, -Deserialisierung und -Bearbeitung auf Basis von bytedance/sonic.

local JSON = require("JSON")
Methode Beschreibung Rückgabewert
encode(value) In JSON serialisieren string | (nil, err)
decode(text) Deserialisieren table | (nil, err)
Methode Beschreibung Rückgabewert
toJSONString(value) Serialisieren ohne Fehlerrückgabe string
toJSONStringIndent(value, prefix?, indent?) Mit Formatierung serialisieren string
toMap(jsonStr) In eine Map umwandeln table | (nil, err)
toStringMap(jsonStr) In eine String-Map umwandeln table | (nil, err)
toSlice(jsonStr) In ein Array umwandeln table | (nil, err)
isValid(jsonStr) JSON-Format validieren boolean
pretty(jsonStr) JSON lesbar formatieren string
merge(json1, json2) Zwei JSON-Dokumente zusammenführen string | (nil, err)
get(jsonStr, key) Wert abrufen any | (nil, err)
set(jsonStr, key, value) Wert setzen string | (nil, err)
remove(jsonStr, key) Schlüssel entfernen string | (nil, err)
clone(value) Tiefe Kopie erstellen any | (nil, err)
local JSON = require("JSON")
local Logger = require("Logger")
-- Grundlegende Serialisierung/Deserialisierung
local obj = {name = "张三", age = 30, tags = {"developer", "golang"}}
local jsonStr = JSON.encode(obj)
Logger.warn(jsonStr) -- {"name":"张三","age":30,"tags":["developer","golang"]}
local decoded, err = JSON.decode(jsonStr)
if not decoded then
Logger.warn("解析失败: " .. err)
else
Logger.warn("姓名: " .. decoded.name)
end
-- Formatierung输出
local pretty = JSON.pretty(jsonStr)
Logger.warn(pretty)
-- JSON validieren
if JSON.isValid(jsonStr) then
Logger.warn("有效的 JSON")
end
-- JSON bearbeiten
local newJson = JSON.set(jsonStr, "city", "北京")
Logger.warn(newJson) -- {"name":"张三","age":30,"tags":[...],"city":"北京"}
local age = JSON.get(newJson, "age")
Logger.warn("年龄: " .. age) -- 30
local removed = JSON.remove(newJson, "age")
Logger.warn(removed) -- {"name":"张三","tags":[...],"city":"北京"}
-- JSON zusammenführen
local json1 = '{"a":1}'
local json2 = '{"b":2}'
local merged = JSON.merge(json1, json2)
Logger.warn(merged) -- {"a":1,"b":2}
-- Tiefe Kopie
local original = {data = {x = 10}}
local copied = JSON.clone(original)

Modul für reguläre Ausdrücke mit Musterprüfung, Suche, Ersetzung und Aufteilung.

local Regex = require("Regex")
Methode Beschreibung Rückgabewert
match(text, pattern) Auf Übereinstimmung prüfen boolean
findAll(text, pattern, limit?) Alle Treffer einschließlich Erfassungsgruppen suchen {{full, g1, g2, …}, …} | (nil, err)
replace(text, pattern, repl) Ersetzen; unterstützt Gruppenreferenzen wie $1 string | (nil, err)
split(text, pattern, limit?) Anhand eines regulären Ausdrucks aufteilen {string, …} | (nil, err)
isEmail(text) Auf E-Mail-Adresse prüfen boolean
isPhone(text) Auf chinesische Mobilfunknummer prüfen boolean
isIP(text) Auf IP-Adresse prüfen boolean
isURL(text) Auf URL prüfen boolean
local Regex = require("Regex")
local Logger = require("Logger")
-- Musterprüfung
if Regex.match("abc123", "\\d+") then
Logger.warn("包含数字")
end
-- Alle Treffer einschließlich Erfassungsgruppen suchen
local matches = Regex.findAll("a1 b22 c333", "(\\w)(\\d+)")
-- matches = {{"a1","a","1"}, {"b22","b","22"}, {"c333","c","333"}}
for i, m in ipairs(matches) do
Logger.warn("匹配 " .. i .. ": " .. m[1] .. ", 字母=" .. m[2] .. ", 数字=" .. m[3])
end
-- Ersetzen mit Unterstützung für Gruppenreferenzen
local s = Regex.replace("abc-123-def", "(\\d+)", "[$1]")
Logger.warn(s) -- "abc-[123]-def"
-- Aufteilen
local parts = Regex.split("a,b,,c", ",", -1)
-- parts = {"a", "b", "", "c"}
for i, p in ipairs(parts) do
Logger.warn("部分 " .. i .. ": '" .. p .. "'")
end
-- Validierung
Logger.warn(Regex.isEmail("test@example.com")) -- true
Logger.warn(Regex.isPhone("13812345678")) -- true
Logger.warn(Regex.isIP("192.168.1.1")) -- true
Logger.warn(Regex.isURL("https://example.com")) -- true

Hilfsfunktionen zur String-Verarbeitung.

local String = require("String")
Methode Beschreibung Rückgabewert
trim(s) Führende und nachgestellte Leerzeichen entfernen string
upper(s) In Großbuchstaben umwandeln string
lower(s) In Kleinbuchstaben umwandeln string
contains(s, sub) Prüfen, ob ein Teilstring enthalten ist boolean
startsWith(s, prefix) Auf angegebenes Präfix prüfen boolean
endsWith(s, suffix) Auf angegebenes Suffix prüfen boolean
local String = require("String")
local s = " Hello World "
Logger.warn(String.trim(s)) -- "Hello World"
Logger.warn(String.upper(s)) -- " HELLO WORLD "
Logger.warn(String.lower(s)) -- " hello world "
Logger.warn(String.contains("hello", "ll")) -- true
Logger.warn(String.startsWith("hello", "he")) -- true
Logger.warn(String.endsWith("hello", "lo")) -- true

Mathematische Hilfsfunktionen.

local Math = require("Math")
Methode Beschreibung Rückgabewert
round(n) Auf die nächste ganze Zahl runden number
floor(n) Abrunden number
ceil(n) Aufrunden number
abs(n) Absolutbetrag number
max(a, b) Maximum number
min(a, b) Minimum number
local Math = require("Math")
Logger.warn(Math.round(3.6)) -- 4
Logger.warn(Math.floor(3.9)) -- 3
Logger.warn(Math.ceil(3.1)) -- 4
Logger.warn(Math.abs(-5)) -- 5
Logger.warn(Math.max(10, 20)) -- 20
Logger.warn(Math.min(10, 20)) -- 10

Hilfsfunktionen für Tabellen (table), einschließlich Iteration über Arrays und Schlüssel-Wert-Paare.

local TableUtils = require("TableUtils")
Methode Beschreibung Rückgabewert
keys(tbl) Alle Schlüssel abrufen {string, …}
values(tbl) Alle Werte abrufen {any, …}
map(tbl, fn) Abbilden mit fn(value, key) {any, …}
filter(tbl, fn) Filtern mit fn(value, key) {any, …}
reduce(tbl, fn, init) Reduzieren mit fn(acc, value, key) any
sortBy(tblOfMaps, key) Stabil nach einem Schlüssel sortieren {map, …}
local T = require("TableUtils")
-- keys/values
local obj = {a = 1, b = 2, c = 3}
local keys = T.keys(obj) -- {"a", "b", "c"}
local values = T.values(obj) -- {1, 2, 3}
-- map (Array)
local arr = {1, 2, 3}
local doubled = T.map(arr, function(v, i)
return v * 2
end)
-- doubled = {2, 4, 6}
-- map (Schlüssel-Wert-Paare)
local mapped = T.map({a=1, b=2}, function(v, k)
return k .. ":" .. v
end)
-- mapped = {"a:1", "b:2"}
-- filter
local arr = {1, 2, 3, 4, 5}
local even = T.filter(arr, function(v, i)
return v % 2 == 0
end)
-- even = {2, 4}
-- reduce
local sum = T.reduce({1, 2, 3}, function(acc, v, i)
return acc + v
end, 0)
-- sum = 6
-- sortBy
local users = {
{name="张三", age=30},
{name="李四", age=25},
{name="王五", age=35}
}
local sorted = T.sortBy(users, "age")
-- sorted = {{name="李四",age=25}, {name="张三",age=30}, {name="王五",age=35}}

Die folgenden Funktionen sind direkt im globalen Gültigkeitsbereich registriert und benötigen kein require.

Funktion Zweck
cp56Time2aToOffsetDateTime(hex[, byteOrder]) IEC-60870-5-Zeit dekodieren und OffsetDateTime zurückgeben
offsetDateTimeToCP56Time2a(time[, byteOrder]) Zeitpunkt als hexadezimale Nutzlast kodieren

byteOrder unterstützt AB und BA. Ohne Angabe gilt das Standardformat AB. Bei expliziter Angabe werden Nutzlasten mit vier Registern unterstützt. Ist die Position der Nullauffüllung mehrdeutig, wird ein Fehler zurückgegeben. Prüfen Sie dies anhand der Registerbelegung des Geräts.

Funktion Beschreibung Rückgabewert
jsonToMap(str) JSON in eine Map umwandeln table | (nil, err)
jsonToList(str) JSON in eine Liste umwandeln table | (nil, err)
jsonToListMap(str) JSON in eine Liste von Maps umwandeln table | (nil, err)
completeDateTime(str) Datums- und Zeit-String vervollständigen string | (nil, err)
quoteJson(str) Anführungszeichen in JSON maskieren string
simpleUUID() Einfache UUID erzeugen string
convertString(str) String-Typkonvertierung durchführen any
isNull(any) Prüfen, ob ein Wert leer ist bool
isNotNull(any) Prüfen, ob ein Wert nicht leer ist bool

isNull betrachtet nil, den leeren String, „null“ unabhängig von Groß-/Kleinschreibung und den Sentinel __Null__ als leer. Der Lua-Ausdruck or 0 behandelt diesen Sentinel nicht.

local Logger = require("Logger")
-- JSON parsen
local map, err = jsonToMap('{"a":1,"b":2}')
if map then
Logger.warn(map.a) -- 1
end
local list = jsonToList('[1,2,3]')
-- list = {1, 2, 3}
-- Zeitangabe vervollständigen
local fullTime = completeDateTime("2024-01-15")
-- fullTime = "2024-01-15T00:00:00.000+08:00"
-- UUID erzeugen
local id = simpleUUID()
Logger.warn(id) -- UUID-String mit 32 Zeichen

Funktion Beschreibung Rückgabewert
getLatestDataValue(dataKey) Neuesten Datenwert abrufen any
getAccountCache(key) Kontocache abrufen any
getEMSDataCache(key) EMS-Datencache abrufen any
getShareCache(key) Freigabecache abrufen any
getMqttCache(key) MQTT-Cache abrufen any
getTriggerCache(key) Trigger-Cache abrufen any
getDeviceShareValue(deviceCode, dataKey) Neuesten freigegebenen Wert eines Geräts anhand von deviceCode und dataKey abrufen string | nil
getDeviceShareValues(deviceCodes, dataKey) Neueste Werte der angegebenen Geräte für dataKey abrufen table
getAllDeviceShareValues(dataKey) Neueste Werte aller Geräte im Freigabebereich für dataKey abrufen table
local Logger = require("Logger")
-- Neueste Gerätedaten abrufen
local value = getLatestDataValue("device1.temperature")
Logger.warn("当前温度: " .. value)
-- Kontoinformationen abrufen
local account = getAccountCache("user123")
if account then
Logger.warn("用户名: " .. account.username)
end
-- Freigegebene Daten abrufen
local sharedData = getShareCache("shared_config")
-- Neuesten freigegebenen Wert eines einzelnen Geräts abrufen
local val = getDeviceShareValue("device1", "temperature")
if val ~= nil then
Logger.warn("设备 device1 温度: " .. val)
end
-- Freigegebene Werte anhand einer Geräteliste abrufen
local deviceCodes = {"device1", "device2"}
local shareValues = getDeviceShareValues(deviceCodes, "temperature")
if shareValues then
for deviceCode, dataValue in pairs(shareValues) do
Logger.warn("设备 " .. deviceCode .. " 温度: " .. dataValue)
end
end
-- Freigegebene Werte aller Geräte abrufen
local allShareValues = getAllDeviceShareValues("temperature")
if allShareValues then
for deviceCode, dataValue in pairs(allShareValues) do
Logger.warn("设备 " .. deviceCode .. " 温度: " .. dataValue)
end
end

Neueste Werte gesammelt anhand eines dataKey-Musters abfragen

Abschnitt betitelt „Neueste Werte gesammelt anhand eines dataKey-Musters abfragen“

Die folgenden Funktionen durchsuchen den lokalen Cache der neuesten Werte. Sie filtern dataKey nach Präfix, Suffix oder Schlüsselwort und geben die passenden Datenpunktinformationen als Tabelle {dataKey: FrontDataDTO} zurück.

Felder des Rückgabewerts (jeder Wert ist ein FrontDataDTO-Objekt mit den folgenden häufig verwendeten Feldern):

Feld Typ Beschreibung
DataKey string Eindeutiger Datenschlüssel
DataValue string Neuester Wert
DataType string Datentyp
DataName string Datenname
DataUnit string Einheit
CollectionTime OffsetDateTime Erfassungszeitpunkt

Hinweis: nil bedeutet, dass der Cache keine Treffer enthält. Der Parameter dataType muss exakt einem Enum-Wert entsprechen: Collection, Customization, Aggregation oder Share.

Funktion Beschreibung Rückgabewert
getLatestDataValuesBySuffix(dataType, suffix) Neueste Werte des angegebenen Typs abfragen, deren dataKey mit suffix endet table | nil
getAllLatestDataValuesBySuffix(suffix) Neueste Werte aller Typen abfragen, deren dataKey mit suffix endet table | nil
Funktion Beschreibung Rückgabewert
getLatestDataValuesByPrefix(dataType, prefix) Neueste Werte des angegebenen Typs abfragen, deren dataKey mit prefix beginnt table | nil
getAllLatestDataValuesByPrefix(prefix) Neueste Werte aller Typen abfragen, deren dataKey mit prefix beginnt table | nil
Funktion Beschreibung Rückgabewert
getLatestDataValuesByPrefixAndSuffix(dataType, prefix, suffix) Neueste Werte des angegebenen Typs abfragen, deren dataKey zugleich prefix und suffix erfüllt table | nil
getAllLatestDataValuesByPrefixAndSuffix(prefix, suffix) Neueste Werte aller Typen abfragen, deren dataKey zugleich prefix und suffix erfüllt table | nil
Funktion Beschreibung Rückgabewert
getLatestDataValuesByFuzzy(dataType, keyword) Neueste Werte des angegebenen Typs abfragen, deren dataKey keyword enthält table | nil
getAllLatestDataValuesByFuzzy(keyword) Neueste Werte aller Typen abfragen, deren dataKey keyword enthält table | nil
local Logger = require("Logger")
-- Neueste Erfassungswerte abfragen, deren Schlüssel mit "_power" endet
local powerValues = getLatestDataValuesBySuffix("Collection", "_power")
if powerValues then
for dataKey, dto in pairs(powerValues) do
Logger.warn(dataKey .. " = " .. dto.DataValue)
end
end
-- Neueste Werte aller Datentypen abfragen, deren Schlüssel mit "_power" endet
local allPower = getAllLatestDataValuesBySuffix("_power")
-- Alle Erfassungsdaten abfragen, deren Schlüssel mit "meter1." beginnt
local meterValues = getLatestDataValuesByPrefix("Collection", "meter1.")
if meterValues then
for dataKey, dto in pairs(meterValues) do
Logger.warnf("%s = %s (%s)", dataKey, dto.DataValue, dto.DataUnit)
end
end
-- Daten aller Typen abfragen, deren Schlüssel mit "meter1." beginnt
local allMeter = getAllLatestDataValuesByPrefix("meter1.")
-- Erfassungsdaten abfragen, deren dataKey mit "meter1." beginnt und mit "_voltage" endet
local voltages = getLatestDataValuesByPrefixAndSuffix("Collection", "meter1.", "_voltage")
-- Daten aller Typen abfragen, die sowohl prefix als auch suffix erfüllen
local allVoltages = getAllLatestDataValuesByPrefixAndSuffix("meter1.", "_voltage")
-- Unscharfe Suche: neueste Aggregationswerte abfragen, deren dataKey "temp" enthält
local tempValues = getLatestDataValuesByFuzzy("Aggregation", "temp")
if tempValues then
for dataKey, dto in pairs(tempValues) do
Logger.warn("温度点位: " .. dataKey .. " = " .. dto.DataValue)
end
end
-- Unscharfe Suche: neueste Werte aller Typen abfragen, deren dataKey "temp" enthält
local allTemp = getAllLatestDataValuesByFuzzy("temp")

Funktion Beschreibung Rückgabewert
getDeviceList(ignoreLocal) Geräteliste abrufen; ignoreLocal=true schließt das lokale Gerät aus table
getDeviceCodeList(ignoreLocal) Liste der deviceCode-Werte abrufen; ignoreLocal=true schließt das lokale Gerät aus table
local Logger = require("Logger")
-- Liste aller Geräte abrufen
local allDevices = getDeviceList(false)
if allDevices then
for i, device in ipairs(allDevices) do
Logger.warn("设备: " .. device.deviceCode .. " - " .. device.deviceName)
end
end
-- Geräteliste ohne das lokale Gerät abrufen
local otherDevices = getDeviceList(true)
if otherDevices then
for i, device in ipairs(otherDevices) do
Logger.warn("共享设备: " .. device.deviceCode)
end
end
-- Liste aller Gerätecodes abrufen (schneller als die vollständige Geräteliste)
local deviceCodes = getDeviceCodeList(false)
if deviceCodes then
for i, code in ipairs(deviceCodes) do
Logger.warn("设备编码: " .. code)
end
end
-- Liste der Gerätecodes ohne das lokale Gerät abrufen
local otherDeviceCodes = getDeviceCodeList(true)

Funktion Beschreibung Rückgabewert
getHistoryData(dataType, dataKey, startTime?, endTime?, formatMap?) Historische Daten abrufen table
getShareHistoryData(deviceCode, dataKey, startTime?, endTime?, formatMap?) Historische freigegebene Daten des angegebenen Geräts abrufen table
getTimeData(dataKey, time?, interval?) Daten zu einem bestimmten Zeitpunkt abrufen table
getShareTimeData(deviceCode, dataKey, time?, interval?) Freigegebene Daten zu einem bestimmten Zeitpunkt abrufen table
deleteCustomizationData(dataKey, startTime?, endTime?) Benutzerdefinierte Daten löschen boolean

Parameter:

  • startTime/endTime/time: Unterstützte Formate:
    • OffsetDateTime-Objekt (empfohlen)
    • Zeit-String, beispielsweise “2024-01-15T10:00:00.000Z”
    • Verkürzter String, beispielsweise “2024-01-15”; wird automatisch vervollständigt
  • formatMap: Optionaler Parameter vom Typ table zur Anpassung der Feldnamen im Ergebnis
    • dataKey: Benutzerdefinierter Feldname für den Datenschlüssel (Standard: “dataKey”)
    • dataValue: Benutzerdefinierter Feldname für den Datenwert (Standard: “dataValue”)
    • collectionTime: Benutzerdefinierter Feldname für den Erfassungszeitpunkt (Standard: “collectionTime”)

Rückgabefelder für den Typ Customization:

Die von getHistoryData und getTimeData für Customization-Daten zurückgegebenen Zeitfelder hängen vom Zeitplantyp ab:

  • DailyChange: availableTime als vollständiger ISO-8601-Datums-/Zeitwert und expiredTime
  • DailyRepeat: availableTime und expiredTime jeweils als HH:mm:ss-String
local OffsetDateTime = require("OffsetDateTime")
local Logger = require("Logger")
-- Methode 1: OffsetDateTime-Objekte verwenden (empfohlen)
local now = OffsetDateTime.now()
local startTime = now:addDays(-7)
local endTime = now
local data = getHistoryData("Collection", "temperature", startTime, endTime)
-- Erweiterung zu Methode 1: Rückgabefeldnamen mit formatMap anpassen
local formatMap = {
dataKey = "key",
dataValue = "value",
collectionTime = "time"
}
local data = getHistoryData("Collection", "temperature", startTime, endTime, formatMap)
-- Methode 2: Zeit-Strings verwenden
local data = getHistoryData("Collection", "temperature", "2024-01-01T00:00:00.000Z", "2024-01-31T23:59:59.000Z")
-- Methode 3: Verkürzte Strings mit automatischer Vervollständigung verwenden
local data = getHistoryData("Collection", "temperature", "2024-01-01", "2024-01-31")
-- Historische freigegebene Daten abfragen
local sharedData = getShareHistoryData("space1", "pressure", startTime, endTime)
-- Daten zu einem bestimmten Zeitpunkt abfragen
local value = getTimeData("temperature", now, "5m")
-- Benutzerdefinierte Daten löschen
local deleted = deleteCustomizationData("data1", startTime, endTime)
Logger.warn("删除成功: " .. tostring(deleted))

Funktion Beschreibung Rückgabewert
buildCommonWriteMap(dataType, dataKey, dataValue, availableDate, expiredDate, changeMod) Allgemeine Schreib-Map erstellen table
buildGeneralWriteMap(dataType, dataKey, dataValue, changeMod) Vereinfachte allgemeine Schreib-Map ohne Zeitparameter erstellen table
buildCustomizationWriteMap(dataKey, dataValue, availableDate, expiredDate) Schreib-Map für DailyChange-Zeitplandaten erstellen; dataType=Customization wird implizit gesetzt table
buildDailyRepeatWriteMap(dataKey, dataValue, availableTime, expiredTime) Schreib-Map für DailyRepeat-Zeitplandaten erstellen; dataType=Customization wird implizit gesetzt, Zeitparameter sind HH:mm:ss-Strings table
updateDailyRepeatSchedule(dataKey, scheduleAvailableDate, scheduleExpiredDate) Gesamten Gültigkeitszeitraum einer DailyRepeat-Konfiguration aktualisieren. Beide Datumsparameter dürfen nil sein; nil bedeutet unbegrenzt bzw. dauerhaft gültig boolean
buildAlarmObservationMap(sourceCode, alarmKey, state, alarmType, alarmLevel, alarmContent[, detailKey]) Beobachtung eines Alarmereignisses erstellen; state ist ACTIVE, NORMAL oder UNKNOWN table
buildCommonAlarmMap(alarmType, alarmContent) Allgemeine Alarm-Map erstellen table
buildMqttAlarmMap(alarmType, alarmContent, mqttConnectionConfigId, topic, qos) MQTT-Alarm-Map erstellen table
buildSlaveWriteMap(deviceCode, dataType, dataKey, dataValue, availableDate, expiredDate, changeMod) Schreib-Map für ein untergeordnetes Gerät erstellen table

Alarmbeobachtungen verwenden eine stabile Kombination aus sourceCode + alarmKey. Im Normalzustand wird NORMAL gesendet, bei fehlenden Werten oder Offline-Status UNKNOWN. Ereignisstatus und Beobachtungsstatus sind unterschiedlich. Den vollständigen Ablauf beschreibt der Alarmlebenszyklus. Die alten Alarm-Erstellungsfunktionen erzeugen weiterhin eigenständige Datensätze.

Die Rückrechnung von Skalierungsfaktoren beim Schreiben von Erfassungsdaten übernimmt CommBridge. Die alte Funktion buildCollectionWriteMap wurde entfernt. Verwenden Sie die allgemeinen Schreib-Erstellungsfunktionen und führen Sie die Umrechnung nicht erneut durch.

Parameter:

  • dataType: Zu bearbeitender Datentyp. Zulässig sind Collection (Erfassung), Customization (benutzerdefinierte Daten/Zeitplandaten), Aggregation (Aggregation), Share (Freigabe) und Alarm (Alarm).
  • availableDate / expiredDate: Nur für Customization vom Typ DailyChange erforderlich. Akzeptieren ISO-8601-Strings oder OffsetDateTime-Objekte. Für andere Typen nil übergeben.
  • availableTime / expiredTime: Nur für Customization vom Typ DailyRepeat erforderlich. Format: "HH:mm:ss", beispielsweise "08:00:00". Der Zeitraum darf Mitternacht nicht überschreiten.
  • changeMod: Boolescher Wert; true bedeutet, dass nur bei einer Wertänderung geschrieben wird.
local OffsetDateTime = require("OffsetDateTime")
-- In einen Erfassungsdatenpunkt schreiben
local writeCollection = buildCommonWriteMap("Collection", "temperature", 25.5, nil, nil, false)
-- In einen benutzerdefinierten Datenpunkt schreiben (DailyChange: vollständiger Datums-/Zeitbereich)
local writeCustom = buildCommonWriteMap(
"Customization", "mode", "1",
"2024-01-15T07:00:00+08:00",
"2024-01-15T18:00:00+08:00",
false
)
-- In einen benutzerdefinierten Datenpunkt schreiben (DailyChange: spezielle Kurzfunktion)
local writeCustom2 = buildCustomizationWriteMap(
"mode", "1",
"2024-01-15T07:00:00+08:00",
"2024-01-15T18:00:00+08:00"
)
-- In einen benutzerdefinierten Datenpunkt schreiben (DailyRepeat: täglich wiederkehrendes Zeitfenster, Format HH:mm:ss)
local writeDailyRepeat = buildDailyRepeatWriteMap("charge_mode", "1", "08:00:00", "18:00:00")
-- Gesamten Gültigkeitszeitraum einer DailyRepeat-Konfiguration aktualisieren
local OffsetDateTime = require("OffsetDateTime")
local ok = updateDailyRepeatSchedule("charge_mode",
OffsetDateTime.parse("2026-01-01T00:00:00+08:00"),
OffsetDateTime.parse("2026-12-31T23:59:59+08:00"))
-- Dauerhafte Gültigkeit festlegen (beide Datumsparameter nil)
local ok2 = updateDailyRepeatSchedule("charge_mode", nil, nil)
-- Beginn festlegen, Ende offenlassen (nil bedeutet kein Ablauf)
local ok3 = updateDailyRepeatSchedule("charge_mode", "2026-01-01", nil)
-- In einen Aggregationsdatenpunkt schreiben (vereinfachte Variante ohne Zeitparameter)
local writeAgg = buildGeneralWriteMap("Aggregation", "avg_temp", 22.5, false)
-- Alarm erstellen (lokalen Alarmeintrag schreiben)
local alarm = buildCommonAlarmMap("TEMP_HIGH", "温度超过80°C")
-- MQTT-Alarm erstellen (MQTT-Verbindungs-ID erforderlich; Alarm wird auch an den MQTT-Broker gemeldet)
local mqttAlarm = buildMqttAlarmMap("TEMP_HIGH", "温度超过80°C", 1, "alarm/upload", 1)
-- In freigegebene Daten eines untergeordneten Geräts schreiben
local slaveWrite = buildSlaveWriteMap("DeviceB", "Share", "shared_temp", 25.5, nil, nil, false)

Funktion Beschreibung Rückgabewert
toFixedLengthBinary(value, length) In eine Binärdarstellung fester Länge umwandeln string | (nil, err)
toDecimal(binaryStr) Binär in Dezimal umwandeln number | (nil, err)
-- Dezimal in Binär umwandeln
local binary = toFixedLengthBinary(10, 8)
Logger.warn(binary) -- "00001010"
-- Binär in Dezimal umwandeln
local decimal = toDecimal("00001010")
Logger.warn(decimal) -- 10

local Logger = require("Logger")
local JSON = require("JSON")
local OffsetDateTime = require("OffsetDateTime")
local Math = require("Math")
local Logger = require("Logger")
Logger.info("设备监控脚本启动")
-- Neueste Gerätedaten abrufen
local temperature = getLatestDataValue("device1.temperature")
local humidity = getLatestDataValue("device1.humidity")
Logger.infof("当前温度: %.1f°C, 湿度: %.1f%%", temperature, humidity)
-- Temperatur auf Alarmbedingung prüfen
if temperature > 80 then
local alarm = buildCommonAlarmMap("TEMP_HIGH", "温度超过80°C")
Logger.error("温度告警: " .. JSON.toJSONString(alarm))
end
-- Historische Daten abfragen
local now = OffsetDateTime.now()
local startTime = now:addHours(-24)
local history = getHistoryData(
"device1",
"temperature",
startTime:toString(),
now:toString()
)
Logger.infof("获取到 %d 条历史数据", #history)
-- Mittelwert berechnen
local sum = 0
for i, record in ipairs(history) do
sum = sum + record.value
end
local avg = sum / #history
Logger.infof("24小时平均温度: %.2f°C", Math.round(avg * 100) / 100)
local JSON = require("JSON")
local Regex = require("Regex")
local TableUtils = require("TableUtils")
local String = require("String")
local Logger = require("Logger")
-- Konfiguration aus dem Cache abrufen
local configJson = getShareCache("device_config")
local config = JSON.decode(configJson)
-- Aktivierte Geräte filtern
local enabledDevices = TableUtils.filter(config.devices, function(device, index)
return device.enabled == true
end)
-- Gerätenamen extrahieren
local deviceNames = TableUtils.map(enabledDevices, function(device, index)
return device.name
end)
-- Daten bereinigen
local cleanedNames = TableUtils.map(deviceNames, function(name, index)
-- Leerzeichen entfernen und in Großbuchstaben umwandeln
return String.upper(String.trim(name))
end)
-- Validierung设备编号格式
for i, device in ipairs(enabledDevices) do
if not Regex.match(device.id, "^DEV\\d{6}$") then
Logger.warnf("设备编号格式错误: %s", device.id)
end
end
-- Ergebnis ausgeben
Logger.info("处理完成: " .. JSON.toJSONString(cleanedNames))

  1. Fehlerbehandlung: Die meisten Funktionen geben (result, error) zurück. Prüfen Sie auf Fehler.
  2. Zeitformat: Zeit-Strings verwenden ISO 8601.
  3. Reguläre Ausdrücke: Es gilt die Syntax von Go, die sich von nativen Lua-Patterns unterscheidet.
  4. Tabelleniteration: map/filter/reduce von TableUtils durchlaufen zuerst den Array-Teil (1..n), anschließend die Schlüssel-Wert-Paare.
  5. Protokollierungsstufe: Die Ausgabestufe von Logger wird durch die Systemkonfiguration bestimmt.
  6. JSON-Leistung: Die Laufzeit verwendet eine leistungsfähige JSON-Verarbeitung, die sich für umfangreiche Serialisierungen eignet.
if isNotNull(${some_key}) then
return {}
end
return { buildCommonWriteMap("Collection", "target_key", ${some_key}, nil, nil, false) }