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 ())
local dt = OffsetDateTime . parse ( " 2024-01-15T10:30:00.000Z " )
Logger . warn ( " 年份: " .. dt : year ())
Logger . warn ( " 月份: " .. dt : month ())
local tomorrow = now : addDays ( 1 )
local nextWeek = now : addDays ( 7 )
Logger . warn ( " 明天: " .. tomorrow : toDateString ())
local hours = nextWeek : diffHours ( now )
Logger . warn ( " 相差小时: " .. hours )
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 " )
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 ())
if now : isBetween ( workStart , workEnd ) then
local breakTime = workStart : addHours ( 3 ): addMinutes ( 30 ) -- 12:30:00
Logger . warn ( " 午休时间: " .. breakTime : toString ())
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 . debug ( " 变量值: x=10 " )
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 )
Logger . warn ( " 解析失败: " .. err )
Logger . warn ( " 姓名: " .. decoded .name)
local pretty = JSON . pretty ( jsonStr )
if JSON . isValid ( jsonStr ) then
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":"北京"}
local merged = JSON . merge ( json1 , json2 )
Logger . warn ( merged ) -- {"a":1,"b":2}
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 " )
if Regex . match ( " abc123 " , " \\ d+ " ) then
-- 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 ])
-- Ersetzen mit Unterstützung für Gruppenreferenzen
local s = Regex . replace ( " abc-123-def " , " ( \\ d+) " , " [$1] " )
Logger . warn ( s ) -- "abc-[123]-def"
local parts = Regex . split ( " a,b,,c " , " , " , - 1 )
-- parts = {"a", "b", "", "c"}
for i , p in ipairs ( parts ) do
Logger . warn ( " 部分 " .. i .. " : ' " .. p .. " ' " )
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 " )
local obj = { a = 1 , b = 2 , c = 3 }
local keys = T . keys ( obj ) -- {"a", "b", "c"}
local values = T . values ( obj ) -- {1, 2, 3}
local doubled = T . map ( arr , function ( v , i )
-- map (Schlüssel-Wert-Paare)
local mapped = T . map ({ a = 1 , b = 2 }, function ( v , k )
-- mapped = {"a:1", "b:2"}
local arr = { 1 , 2 , 3 , 4 , 5 }
local even = T . filter ( arr , function ( v , i )
local sum = T . reduce ({ 1 , 2 , 3 }, function ( acc , v , i )
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 " )
local map , err = jsonToMap ( ' {"a":1,"b":2} ' )
local list = jsonToList ( ' [1,2,3] ' )
-- Zeitangabe vervollständigen
local fullTime = completeDateTime ( " 2024-01-15 " )
-- fullTime = "2024-01-15T00:00:00.000+08:00"
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 " )
Logger . warn ( " 用户名: " .. account .username)
-- Freigegebene Daten abrufen
local sharedData = getShareCache ( " shared_config " )
-- Neuesten freigegebenen Wert eines einzelnen Geräts abrufen
local val = getDeviceShareValue ( " device1 " , " temperature " )
Logger . warn ( " 设备 device1 温度: " .. val )
-- Freigegebene Werte anhand einer Geräteliste abrufen
local deviceCodes = { " device1 " , " device2 " }
local shareValues = getDeviceShareValues ( deviceCodes , " temperature " )
for deviceCode , dataValue in pairs ( shareValues ) do
Logger . warn ( " 设备 " .. deviceCode .. " 温度: " .. dataValue )
-- Freigegebene Werte aller Geräte abrufen
local allShareValues = getAllDeviceShareValues ( " temperature " )
for deviceCode , dataValue in pairs ( allShareValues ) do
Logger . warn ( " 设备 " .. deviceCode .. " 温度: " .. dataValue )
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 " )
for dataKey , dto in pairs ( powerValues ) do
Logger . warn ( dataKey .. " = " .. dto .DataValue)
-- 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. " )
for dataKey , dto in pairs ( meterValues ) do
Logger . warnf ( " %s = %s (%s) " , dataKey , dto .DataValue, dto .DataUnit)
-- 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 " )
for dataKey , dto in pairs ( tempValues ) do
Logger . warn ( " 温度点位: " .. dataKey .. " = " .. dto .DataValue)
-- 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 )
for i , device in ipairs ( allDevices ) do
Logger . warn ( " 设备: " .. device .deviceCode .. " - " .. device .deviceName)
-- Geräteliste ohne das lokale Gerät abrufen
local otherDevices = getDeviceList ( true )
for i , device in ipairs ( otherDevices ) do
Logger . warn ( " 共享设备: " .. device .deviceCode)
-- Liste aller Gerätecodes abrufen (schneller als die vollständige Geräteliste)
local deviceCodes = getDeviceCodeList ( false )
for i , code in ipairs ( deviceCodes ) do
Logger . warn ( " 设备编码: " .. code )
-- 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 data = getHistoryData ( " Collection " , " temperature " , startTime , endTime )
-- Erweiterung zu Methode 1: Rückgabefeldnamen mit formatMap anpassen
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 " ,
-- In einen benutzerdefinierten Datenpunkt schreiben (DailyChange: spezielle Kurzfunktion)
local writeCustom2 = buildCustomizationWriteMap (
" 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 " )
-- 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
local alarm = buildCommonAlarmMap ( " TEMP_HIGH " , " 温度超过80°C " )
Logger . error ( " 温度告警: " .. JSON . toJSONString ( alarm ))
-- Historische Daten abfragen
local now = OffsetDateTime . now ()
local startTime = now : addHours ( - 24 )
local history = getHistoryData (
Logger . infof ( " 获取到 %d 条历史数据 " , # history )
for i , record in ipairs ( history ) do
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
-- Gerätenamen extrahieren
local deviceNames = TableUtils . map ( enabledDevices , function ( device , index )
local cleanedNames = TableUtils . map ( deviceNames , function ( name , index )
-- Leerzeichen entfernen und in Großbuchstaben umwandeln
return String . upper ( String . trim ( name ))
for i , device in ipairs ( enabledDevices ) do
if not Regex . match ( device .id, " ^DEV \\ d{6}$ " ) then
Logger . warnf ( " 设备编号格式错误: %s " , device .id)
Logger . info ( " 处理完成: " .. JSON . toJSONString ( cleanedNames ))
Fehlerbehandlung: Die meisten Funktionen geben (result, error) zurück. Prüfen Sie auf Fehler.
Zeitformat: Zeit-Strings verwenden ISO 8601.
Reguläre Ausdrücke: Es gilt die Syntax von Go, die sich von nativen Lua-Patterns unterscheidet.
Tabelleniteration: map/filter/reduce von TableUtils durchlaufen zuerst den Array-Teil (1..n), anschließend die Schlüssel-Wert-Paare.
Protokollierungsstufe: Die Ausgabestufe von Logger wird durch die Systemkonfiguration bestimmt.
JSON-Leistung: Die Laufzeit verwendet eine leistungsfähige JSON-Verarbeitung, die sich für umfangreiche Serialisierungen eignet.
if isNotNull (${ some_key }) then
return { buildCommonWriteMap ( " Collection " , " target_key " , ${ some_key }, nil , nil , false ) }