Nastavení e-mailových notifikací
Přehled příkladu
V tomto návodu postavíme vlastní Rule Chain, která sleduje telemetrii (teplotu a vlhkost) z konkrétních zařízení (například „Knihovna" a „Archiv"). Když hodnoty překročí předem daný prah, systém vyvolá e-mailovou notifikaci.
Vytáhneme také „Label" přiřazený zařízení, abychom ho použili v textu e-mailu, a skriptem převedeme výchozí unixový timestamp na čitelný středoevropský čas (CET).
Takhle bude výsledná notifikační Rule Chain vypadat:

Předpoklady
Než začnete, ujistěte se, že má vaše instance ThingsBoardu nastavený odchozí SMTP server. Přejděte na Settings -> Outgoing Mail a zadejte přihlašovací údaje k SMTP. Tlačítkem „Send Test Mail" si ověříte, že to funguje.
Návod krok za krokem
Krok 1: Enrichment: Originator Fields (přidání labelů)
ThingsBoard ve výchozím stavu „Label" zařízení do metadat rule enginu nepředává. Musíme si ho nejdřív načíst, abychom ho mohli použít ve skriptech a e-mailech.
- Typ uzlu:
Enrichment->originator fields - Název: Adding Labels
- Konfigurace: Klikněte na „Add mapping".
- Source field:
Label - Target key:
deviceLabel - Add mapped originator fields to:
Metadata
- Source field:
Krok 2: Filter: Script (filtr zařízení)
Chceme zpracovávat výstrahy jen pro konkrétní zařízení podle jejich labelů.
- Typ uzlu:
Filter->script - Název: Device Filter
- Jazyk: Přepněte z TBEL na
JavaScript - Kód:
var deviceLabel = metadata.deviceLabel;
// Replace the numbers/strings with your actual device labels or IDs
return deviceLabel === '2159020251' || deviceLabel === '2159020252';
- Spojení: Spojte uzel Adding Labels s tímto uzlem linkou Success.
Krok 3: Transformation: Script (formátování dat)
Klíče telemetrie často obsahují tečky (například hygrometer.temperature.avg), což může rozbít výchozí šablonování e-mailů. Výchozí timestamp je navíc v unixových milisekundách (UTC). Tento skript hodnoty bezpečně vytáhne a čas naformátuje do čitelné podoby (přidá 1 hodinu pro CET).
- Typ uzlu:
Transformation->script - Název: Temperature & Humidity Formatting
- Jazyk: Přepněte z TBEL na
JavaScript - Kód:
Zobrazit skript
// Initialize default values to prevent "is not defined" errors in email templates
metadata.formattedTemperature = "N/A";
metadata.formattedHumidity = "N/A";
// Get Temperature
var temp = msg['hygrometer.temperature.avg'];
if (temp != null) {
metadata.formattedTemperature = temp;
}
// Get Humidity
var hum = msg['hygrometer.humidity.avg'];
if (hum != null) {
metadata.formattedHumidity = hum;
}
// Get Timestamp and convert to Date object
var date = metadata.ts ? new Date(Number(metadata.ts)) : new Date();
// Shift time from UTC to local time (+1 hour for CET)
date.setHours(date.getHours() + 1);
// Format to DD.MM.YYYY HH:MM:SS
var pad = function(n) { return n < 10 ? '0' + n : n; };
var day = pad(date.getDate());
var month = pad(date.getMonth() + 1);
var year = date.getFullYear();
var hours = pad(date.getHours());
var minutes = pad(date.getMinutes());
var seconds = pad(date.getSeconds());
metadata.formattedTime = day + "." + month + "." + year + " " + hours + ":" + minutes + ":" + seconds;
return {msg: msg, metadata: metadata, msgType: msgType};
- Spojení: Spojte uzel Device Filter s tímto uzlem linkou True.
Krok 4: Filter: Script (prahové filtry)
Teď tok rozdělíme podle konkrétních podmínek. Pro každou podmínku vytvořte filtr. Například kontrola nízké teploty:
- Typ uzlu:
Filter->script - Název: Temperature < 17
- Jazyk:
JavaScript - Kód:
return msg['hygrometer.temperature.avg'] < 17;
(Tento krok zopakujte a vytvořte paralelní filtry pro další prahy, například Temperature > 20, Humidity < 27, Humidity > 58.)
- Spojení: Spojte uzel Temperature & Humidity Formatting se všemi svými prahovými filtry linkami Success.
Krok 5: Transformation: To Email (Email Info)
Tento uzel skládá samotný předmět a tělo e-mailu. Můžete si vybrat, jestli poslat jednoduchý e-mail v čistém textu, nebo formátovaný HTML e-mail. Vytvořte jeden pro každý prahový filtr.
- Typ uzlu:
Transformation->to email - Název: Email Info
- From:
"System Alert" <dashboards@hardwario.com> - To:
your.email@example.com(Poznámka: E-mailovou adresu napište jako čistý text, u statické adresy NEPOUŽÍVEJTE proměnné${}.) - Subject:
Alert: Device ${deviceName} - Low Temperature
Varianta A: e-mail v čistém textu Pokud chcete jednoduchý e-mail bez zvláštního formátování, zvolte Plain Text. Zalomení řádků (stisk Enteru) bude fungovat přirozeně.
- Mail body type: Zvolte
Plain Text(nebo podle verze ThingsBoardu odškrtněte volbu HTML) - Body:
Hello, measured values in your facility have exceeded the defined limits:
Facility: ${deviceName}
Device: ${deviceLabel}
Sensor: Temperature
Value: ${formattedTemperature} °C
Measurement Time: ${formattedTime}
Your HARDWARIO IoT Team
Varianta B: HTML e-mail
Pokud chcete formátovat, zvolte HTML. Pozor, v HTML se běžná zalomení řádků ignorují, takže nový řádek musíte vytvořit tagem <br>. Můžete použít i tagy jako <b>text</b> pro tučný text nebo <i>text</i> pro kurzivu.
- Mail body type: Zvolte
HTML - Body:
Hello, measured values in your facility have exceeded the defined limits:<br><br>
Facility: <b>${deviceName}</b><br>
Device: <i>${deviceLabel}</i><br>
Sensor: Temperature<br>
Value: <b>${formattedTemperature} °C</b><br>
Measurement Time: ${formattedTime}<br><br>
Your HARDWARIO IoT Team
(U uzlů pro vlhkost text upravte: „Temperature" změňte na „Humidity" a proměnnou na ${formattedHumidity} %.)
- Spojení: Spojte příslušný prahový filtr (například Temperature < 17) s tímto uzlem linkou True.
Krok 6: Action: Send Email
Tohle je poslední výkonný uzel, který komunikuje s vaším SMTP serverem a složené e-maily odesílá.
- Typ uzlu:
Action->send email - Název: Send Email
- Konfigurace: Nechte výchozí (použije systémové nastavení SMTP).
- Spojení: Spojte všechny své uzly Email Info s tímto jediným uzlem Send Email linkami Success.
Krok 7: Napojení na Root Rule Chain
Vaše vlastní notifikační Rule Chain je hotová, ale ThingsBoard neví, že do ní má příchozí telemetrii směrovat. Musíme ji napojit uvnitř hlavní Root Rule Chain.
- Přejděte na Rule Chains a otevřete svou Root Rule Chain (výchozí řetězec, který obsluhuje všechny příchozí zprávy).
- Najděte uzel Message Type Switch.
- Sledujte linku Post telemetry vycházející z tohoto uzlu. Měla by vést k uzlu Save Timeseries.
- V levém menu najděte uzel Rule Chain (v kategorii Rule Chains) a přetáhněte ho na plochu.
- V nastavení uzlu zvolte novou Rule Chain, kterou jste právě vytvořili (například „EMAIL - Notifications").
- Tažením vytvořte spojení z uzlu Save Timeseries do svého nově přidaného uzlu Rule Chain.
- Jako popisek linky zvolte Success.
- Klikněte na tlačítko Apply changes (fajfka v pravém dolním rohu).
Takhle by spojení v Root Rule Chain mělo vypadat: (Data teď úspěšně potečou ze zařízení, uloží se do databáze a půjdou dál do vašeho vlastního řetězce e-mailových notifikací!)

Omezení frekvence e-mailů
Pokud zařízení posílá data překračující prah nepřetržitě (například každých 15 minut), posílalo by výše popsané nastavení e-mail každých 15 minut. Abychom zabránili zaplavení e-maily, můžeme zavést mechanismus, který si zapíše čas posledního odeslaného e-mailu a další e-maily blokuje, dokud neuplyne daný interval (například 24 hodin).
Znamená to upravit Rule Chain tak, aby čítala serverový atribut (lastEmailTime), zkontrolovala, jestli uplynul dostatek času, a po odeslání e-mailu tento atribut aktualizovala novým timestampem.
Takhle vypadá upravený tok:

Krok 1: Přečtěte čas posledního e-mailu
Na úplný začátek toku (před prahové filtry) přidejte uzel, který načte timestamp posledního odeslaného e-mailu.
- Typ uzlu:
Enrichment->originator attributes - Název: Get Last Email Time
- Server attributes: Přidejte
lastEmailTime - Spojení: Spojte tento uzel se začátkem svých prahových filtrů (například místo spojení z předchozích formátovacích uzlů).
Krok 2: Upravte prahové filtry, aby kontrolovaly čas
Upravte své existující skripty prahových filtrů (například Temperature < 17) tak, aby kromě telemetrické hodnoty kontrolovaly i to, jestli od lastEmailTime uplynula požadovaná prodleva.
- Typ uzlu:
Filter->script - Ukázka kódu (kontrola 24hodinové prodlevy = 86400000 milisekund):
Zobrazit ukázku skriptu
var currentTime = new Date().getTime();
var lastEmailTime = metadata.ss_lastEmailTime ? Number(metadata.ss_lastEmailTime) : 0;
var delayMs = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
// Check if the value exceeds the threshold AND the delay has passed
if (msg['hygrometer.temperature.avg'] < 17) {
if (currentTime - lastEmailTime >= delayMs) {
return true; // Send email
}
}
return false; // Do not send email
(Tuto logiku použijte u všech svých prahových filtrů.)
Krok 3: Připravte nový timestamp
Pokud filtr propustí zprávu (e-mail se má poslat), musíme vytvořit novou zprávu, která aktuální čas uloží zpět do serverových atributů zařízení. Tok proto musíme rozvětvit do dvou směrů: jeden odešle e-mail, druhý aktualizuje atribut.
- Typ uzlu:
Transformation->script - Název: Prepare Timestamp - [název podmínky] (například Prepare Timestamp - Temp < 17)
- Kód:
// Create a new message containing the current timestamp
var newMsg = {
"lastEmailTime": new Date().getTime()
};
return {msg: newMsg, metadata: metadata, msgType: 'POST_ATTRIBUTES_REQUEST'};
- Spojení: Spojte konkrétní prahový filtr (například
Temperature < 17) s tímto uzlem linkou True.
Krok 4: Uložte nový timestamp
Nakonec akčním uzlem uložte nový timestamp jako serverový atribut, aby se dal přečíst při další aktualizaci telemetrie.
- Typ uzlu:
Action->save attributes - Název: Save Last Email Time
- Scope: Server attributes
- Spojení: Spojte uzel „Prepare Timestamp" s tímto uzlem linkou Success.