Príklady skriptov
Kompletné skripty TapHome: bezpečné delenie, 0 namiesto neznámej hodnoty, stmievanie cez LINEAR, alarmy a servisné atribúty Modbus, HTTP a JSON, MQTT listener skript a Wake on LAN.
Kompletné skripty pre bežné úlohy. Recepty pre smart rules fungujú v každej inštalácii; príklady Modbus a Packet parser pochádzajú z oficiálnych repozitárov šablón pre Modbus a Packet parser. Krátke mená ako Se, va1 alebo St sú skratky hodnôt zariadení vybraných v editore skriptu; mená ako StatusJson alebo plugTopic sú premenné modulu.
Recepty pre smart rules
Bezpečné delenie dvoch hodnôt
Delenie hodnotou zariadenia, ktorá je 0, zastaví skript hlásením Line in script: 1 Message: Division by zero. Delenie va1/va2 vložte do funkčného tvaru IF. Ten vyhodnotí iba zvolenú vetvu, takže delenie prebehne, len keď je deliteľ väčší ako 0:
IF(va2 > 0, va1/va2, 0);
# Result: 0 when va2 is 0, otherwise va1 divided by va2Keď môže byť deliteľ záporný, testujte namiesto toho va2 <> 0. Viac v Chybách.
Zápis 0 namiesto neznámej hodnoty
Neznáma hodnota zariadenia, napríklad zo senzora v chybe, je NaN. Ak chcete namiesto nej zapísať 0, otestujte ju cez ISNAN — vzor je IF(ISNAN(x), 0, x):
IF(ISNAN(Se), 0, Se);
# Result: 0 while the value of Se is unknown, otherwise the value of SePorovnanie ako Se = NaN je chyba pri parsovaní. Keď hodnota môže byť aj Null (žiadna hodnota), testujte najprv ISNULL; OR svoju pravú stranu preskočí, keď je ľavá strana TRUE:
IF(ISNULL(Se) OR ISNAN(Se), 0, Se);Stmievanie cez LINEAR
LINEAR prevedie rozsah vstupných hodnôt na rozsah výstupných hodnôt, čo je bežný spôsob, ako vypočítať úroveň stmievania. Úroveň stmievača ide od 0 (vypnuté) po 1 (100 %). V smart rule Vzorec so stmievačom ako výstupom tento skript stlmí svetlo, keď denné svetlo stúpa od 0 do 500 lx (Se je senzor osvetlenia):
LINEAR(Se, 0, 1, 500, 0);
# Result: 1 at 0 lx, 0.5 at 250 lx, 0 at 500 lx and moreMimo vstupného rozsahu ostane výsledok na bližšom konci (BOUNDS, predvolené správanie). Ak chcete zachovať minimálnu úroveň, zvýšte nižšiu výstupnú hodnotu: LINEAR(Se, 0, 1, 500, 0.1) nikdy neklesne pod 10 %. Podrobnosti v LINEAR.
Príklady Modbus
Chyby zariadenia z alarmového registra
Skript na čítanie solárneho invertora Solax premení stavový register a 32-bitové alarmové slovo na chyby zariadenia:
VAR reg := MODBUSR(A, 0x09, UInt16);
IF(reg = 3, ADDERROR("Run Mode Fault"));
IF(reg = 4, ADDERROR("Run Mode Permanent Fault"));
VAR x3 := MODBUSR(A, 0x0040, Uint32);
IF(GETBIT(x3, 0) = 1, ADDERROR("TZ Protect Fault"));
IF(GETBIT(x3, 1) = 1, ADDERROR("Grid Lost Fault"));
IF(GETBIT(x3, 2) = 1, ADDERROR("Grid Volt Fault"));
IF(GETBIT(x3, 15) = 1, ADDERROR("Off-grid Overload"));Servisný atribút z bitových polí
Servisný atribút Komfovent zobrazí štyri bajty 32-bitového registra ako text oddelený bodkami:
VAR reg := MODBUSR(H, 22, Uint32);
VAR first := GETBITS(reg, 0, 8);
VAR second := GETBITS(reg, 8, 8);
VAR third := GETBITS(reg, 16, 8);
VAR last := GETBITS(reg, 24, 8);
RETURN(last + "." + third + "." + second + "." + first);
# Result: text such as "1.2.3.4"Servisná akcia s parametrom
Parametre servisnej akcie sú premenné pomenované podľa svojej skratky. Akcia pre Eastron SDM120 zapíše svoj parameter ID do holding registra 20:
MODBUSW(H, 20, Float, ID)Dekódovanie enumerácie
Stavový register Huawei SUN2000 sa cez SWITCH zmení na čitateľný text:
VAR state := MODBUSR(H, 32089, Uint16);
SWITCH(state,
0, "Idle: Initializing",
1, "Idle: Detecting ISO",
256, "Starting",
512, "On-Grid",
768, "Shutdown: Fault",
"Unknown");Príklady Packet parser
HTTP požiadavka so spracovaním chýb
SENDHTTPREQUEST vráti objekt httpresponse. Tento skript na čítanie (Forecast.solar) si telo odpovede uloží do premennej output na neskoršie parsovanie a neúspešnú požiadavku nahlási ako chybu zariadenia:
VAR response := SENDHTTPREQUEST("/estimate/" + Latitude + "/" + Longitude + "/"
+ PV_declination + "/" + PV_azimuth + "/" + PV_kWp,
"GET", "", "Accept: application/json");
IF response.IsSuccess
output := response.Content;
ELSE
ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
ENDUptime z JSON
Servisný atribút Shelly 1PM naformátuje uptime v sekundách z uloženého stavového JSON:
VAR upTimeSeconds := PARSEJSON(StatusJson, "uptime");
VAR days := FLOOR(upTimeSeconds / 86400, 1);
upTimeSeconds := MOD(upTimeSeconds, 86400);
VAR hours := FLOOR(upTimeSeconds / 3600, 1);
upTimeSeconds := MOD(upTimeSeconds, 3600);
VAR minutes := FLOOR(upTimeSeconds / 60, 1);
days + " day(s) " + hours + "h " + minutes + "m";
# Result: for 191820 seconds "2 day(s) 5h 17m"Spotová cena za aktuálnu periódu
Skript na čítanie stiahne dnešné ceny z okte.sk:
VAR today := TOSTRING(NOW(), "yyyy-MM-dd");
VAR response := SENDHTTPREQUEST("/api/v1/dam/results?deliveryDayFrom=" + today
+ "&deliveryDayTo=" + today);
IF response.IsSuccess
output := response.Content;
ELSE
ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
ENDServisný atribút potom vyberie jednu periódu filtrom JSONPath:
PARSEJSON(output, "$[?(@.period == 1)].price") + " EUR"Cyklus nad poľom JSON
S TRUE ako tretím argumentom PARSEJSON za posledným prvkom nezlyhá, ale vráti Null, čím sa cyklus skončí:
VAR response := SENDHTTPREQUEST("/api/taphomeapi/v1/discovery", "GET", "",
"Authorization: TapHome " + API_token);
IF response.IsSuccess
VAR ret := "";
VAR i := 0;
VAR id := PARSEJSON(response.Content, "$.devices[0].deviceId", TRUE);
WHILE !ISNULL(id)
ret := ret + "(" + id + ") ";
ret := ret + PARSEJSON(response.Content, "$.devices[" + TOSTRING(i) + "].name", TRUE);
ret := ret + " - " + PARSEJSON(response.Content, "$.devices[" + TOSTRING(i) + "].type", TRUE);
ret := ret + "\n";
i := i + 1;
id := PARSEJSON(response.Content, "$.devices[" + TOSTRING(i) + "].deviceId", TRUE);
LOOP
RETURN(ret);
ENDKontrola premennej modulu v listener skripte
Listener skript pre Shelly MQTT najprv overí, že premenná modulu plugTopic je vyplnená, a potom prevedie nameraný výkon z W na kW:
IF(INDEXOF(plugTopic, "shelly1pm-deviceid") = 0)
ADDERROR("Set correct 'plugTopic' value in module variables. "
+ "Topic format is 'shelly1pm-<deviceid>'.");
RETURN(-1);
END
IF(RECEIVEDMSG.TOPIC = "shellies/" + plugTopic + "/relay/0/power")
VAR valueP := TOSTRING(RECEIVEDMSG.PAYLOAD);
Ed := IF(ISNULL(valueP), NaN, TODOUBLE(valueP) / 1000.0);
ENDWake on LAN
Tlačidlo na module UDP pošle magic packet. Premenná modulu MAC obsahuje adresu ako text ("12 34 56 78 9a bc"); BYTECOLLECTION medzery ignoruje:
VAR magicPacket := BYTECOLLECTION("FF FF FF FF FF FF " + MAC + MAC + MAC + MAC
+ MAC + MAC + MAC + MAC + MAC + MAC + MAC + MAC + MAC + MAC + MAC + MAC);
SENDDATA(magicPacket);