Szkriptpéldák
Teljes TapHome szkriptek: biztonságos osztás, 0 ismeretlen érték helyett, fényerő-szabályozás LINEAR-ral, Modbus riasztások és szolgáltatási attribútumok, HTTP és JSON, MQTT listener és Wake on LAN.
Teljes szkriptek gyakori feladatokhoz. A smart rule receptek bármely telepítésben működnek; a Modbus és Packet parser példák a hivatalos Modbus és Packet parser sablontárakból származnak. Az olyan rövid nevek, mint a Se, a va1 vagy az St, a szkriptszerkesztőben kiválasztott eszközértékek rövidítései; az olyan nevek, mint a StatusJson vagy a plugTopic, modulváltozók.
Smart rule receptek
Két érték biztonságos osztása
A 0 értékű eszközértékkel való osztás a Line in script: 1 Message: Division by zero hibával leállítja a szkriptet. Foglald a va1/va2 osztást az IF függvényalakjába. Ez csak a kiválasztott ágat értékeli ki, így az osztás csak akkor fut le, ha az osztó nagyobb 0-nál:
IF(va2 > 0, va1/va2, 0);
# Result: 0 when va2 is 0, otherwise va1 divided by va2Ha az osztó negatív is lehet, inkább a va2 <> 0 feltételt vizsgáld. Bővebben a Hibák oldalon.
0 írása ismeretlen érték helyett
Az ismeretlen eszközérték, például egy hibás érzékelőé, NaN. Ha helyette 0 értéket szeretnél írni, vizsgáld az ISNAN függvénnyel — a minta IF(ISNAN(x), 0, x):
IF(ISNAN(Se), 0, Se);
# Result: 0 while the value of Se is unknown, otherwise the value of SeAz olyan összehasonlítás, mint a Se = NaN, elemzési hiba. Ha az érték Null (nincs érték) is lehet, előbb az ISNULL függvénnyel vizsgáld; az OR kihagyja a jobb oldalát, ha a bal oldala TRUE:
IF(ISNULL(Se) OR ISNAN(Se), 0, Se);Fényerő-szabályozás LINEAR-ral
A LINEAR a bemeneti értékek egy tartományát kimeneti értékek tartományára képezi le, ez a fényerőszint kiszámításának szokásos módja. A dimmer szintje 0-tól (kikapcsolva) 1-ig (100 %) terjed. Egy dimmert kimenetként használó Képlet smart rule-ban ez a szkript csökkenti a lámpa fényerejét, ahogy a nappali fény 0-ról 500 lx-ra nő (Se a fényérzékelő):
LINEAR(Se, 0, 1, 500, 0);
# Result: 1 at 0 lx, 0.5 at 250 lx, 0 at 500 lx and moreA bemeneti tartományon kívül az eredmény a legközelebbi végponton marad (BOUNDS, az alapértelmezés). Minimális szint megtartásához emeld meg az alsó kimenetet: a LINEAR(Se, 0, 1, 500, 0.1) soha nem megy 10 % alá. Részletek a LINEAR részben.
Modbus példák
Eszközhibák riasztási regiszterből
Egy Solax napelem inverter olvasó szkriptje egy állapotregisztert és egy 32 bites riasztási szót eszközhibákká alakít:
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"));Szolgáltatási attribútum bitmezőkből
Egy Komfovent szolgáltatási attribútum egy 32 bites regiszter négy bájtját pontokkal elválasztott szövegként jeleníti meg:
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"Szolgáltatási művelet paraméterrel
A szolgáltatási művelet paraméterei a rövidítésükről elnevezett változók. Egy Eastron SDM120 művelet az ID paraméterét a 20-as holding regiszterbe írja:
MODBUSW(H, 20, Float, ID)Felsorolás dekódolása
Egy Huawei SUN2000 állapotregiszterből a SWITCH függvénnyel lesz olvasható szöveg:
VAR state := MODBUSR(H, 32089, Uint16);
SWITCH(state,
0, "Idle: Initializing",
1, "Idle: Detecting ISO",
256, "Starting",
512, "On-Grid",
768, "Shutdown: Fault",
"Unknown");Packet parser példák
HTTP-kérés hibakezeléssel
A SENDHTTPREQUEST egy httpresponse objektumot ad vissza. Ez az olvasó szkript (Forecast.solar) a válasz törzsét az output változóban tárolja a későbbi elemzéshez, a sikertelen kérést pedig eszközhibaként jelzi:
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 + ")");
ENDÜzemidő JSON-ból
Egy Shelly 1PM szolgáltatási attribútum a gyorsítótárban tárolt állapot-JSON-ból formázza meg a másodpercben megadott üzemidőt:
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"Spot ár az aktuális időszakra
Egy olvasó szkript letölti a mai árakat az okte.sk oldalról:
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 + ")");
ENDEzután egy szolgáltatási attribútum JSONPath szűrővel kiválaszt egy időszakot:
PARSEJSON(output, "$[?(@.period == 1)].price") + " EUR"Ciklus JSON tömbön
Harmadik argumentumként TRUE értékkel a PARSEJSON az utolsó elem után hiba helyett Null értéket ad vissza, ami befejezi a ciklust:
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);
ENDModulváltozó ellenőrzése listener szkriptben
Egy Shelly MQTT listener szkript először ellenőrzi, hogy a plugTopic modulváltozó ki van-e töltve, majd a teljesítményértéket W-ból kW-ba alakítja:
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
Egy UDP nyomógomb magic packetet küld. A MAC modulváltozó szövegként tárolja a címet ("12 34 56 78 9a bc"); a BYTECOLLECTION figyelmen kívül hagyja a szóközöket:
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);