Nastavení e-mailových notifikací
Přehled příkladu
V tomto návodu sestavíme vlastní Rule Chain, která sleduje telemetrii (teplotu a vlhkost) z vybraných zařízení (například „Knihovna“ a „Archiv“). Když hodnoty překročí nastavené limity, systém odešle e-mailovou notifikaci.
Do textu e-mailu také doplníme „Label“ přiřazený zařízení a skriptem převedeme výchozí unixový timestamp na čitelný středoevropský čas (CET).
Takto bude výsledná notifikační Rule Chain vypadat:

Předpoklady
Instance ThingsBoard musí mít nastavený odchozí server SMTP. Přejděte na Settings -> Outgoing Mail a zadejte přihlašovací údaje k SMTP. Tlačítkem „Send Test Mail“ ověříte, že nastavení funguje.
Návod krok za krokem
Krok 1: Enrichment: Originator Fields (přidání labelů)
ThingsBoard ve výchozím stavu nepředává „Label“ zařízení do metadat rule enginu. Nejdřív ho proto načteme, 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í)
Upozornění chceme zpracovávat jen pro vybraná 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), s čímž si výchozí šablony e-mailů nemusí poradit. Výchozí timestamp je navíc v unixových milisekundách (UTC). Tento skript hodnoty bezpečně načte a čas převede do čitelné podoby (pro CET přičte 1 hodinu).
- 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 jednotlivých podmínek. Pro každou podmínku vytvořte filtr, například pro kontrolu 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 prahovými filtry linkami Success.
Krok 5: Transformation: To Email (Email Info)
Tento uzel sestaví předmět a tělo e-mailu. Můžete poslat jednoduchý e-mail v prostém textu, nebo e-mail formátovaný v HTML. Pro každý prahový filtr vytvořte jeden takový uzel.
- 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 prostý text, u pevné adresy nepoužívejte proměnné${}.) - Subject:
Alert: Device ${deviceName} - Low Temperature
Varianta A: e-mail v prostém textu Pokud chcete jednoduchý e-mail bez zvláštního formátování, zvolte Plain Text. Zalomení řádků (klávesou Enter) se zachová.
- Mail body type: Zvolte
Plain Text(nebo podle verze ThingsBoard 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: e-mail v HTML
Pokud chcete text 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
Tento poslední uzel předá sestavené e-maily serveru SMTP k odeslání.
- Typ uzlu:
Action->send email - Název: Send Email
- Konfigurace: Nechte výchozí (použije systémové nastavení SMTP).
- Spojení: Spojte všechny uzly Email Info s tímto jediným uzlem Send Email linkami Success.
Krok 7: Napojení na Root Rule Chain
Vlastní notifikační Rule Chain je hotová, ThingsBoard ale zatím neví, že do ní má posílat příchozí telemetrii. Proto ji napojíme do 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 nově přidaného uzlu Rule Chain.
- Jako popisek linky zvolte Success.
- Klikněte na tlačítko Apply changes (ikona zaškrtnutí vpravo dole).
Takto má spojení v Root Rule Chain vypadat: (Data teď ze zařízení potečou do databáze a odtud dál do vlastního řetězce e-mailových notifikací.)

Omezení četnosti e-mailů
Pokud zařízení posílá data nad limitem trvale (například každých 15 minut), výše popsané nastavení by posílalo e-mail každých 15 minut. Aby e-maily nezahltily schránku, můžeme si zapamatovat čas posledního odeslaného e-mailu a další e-maily blokovat, dokud neuplyne daný interval (například 24 hodin).
Rule Chain proto upravíme tak, aby načítala serverový atribut (lastEmailTime), kontrolovala, jestli uplynul dostatek času, a po odeslání e-mailu tento atribut aktualizovala novým timestampem.
Takto 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 s prahovými filtry (například místo dosavadního spojení z formátovacích uzlů).
Krok 2: Upravte prahové filtry, aby kontrolovaly čas
Upravte stávají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 prahových filtrů.)
Krok 3: Připravte nový timestamp
Když filtr zprávu propustí (e-mail se má odeslat), vytvoříme novou zprávu, která uloží aktuální čas zpět do serverových atributů zařízení. Tok se proto větví 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.