Přeskočit na hlavní obsah

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:

Notifikační Rule Chain: labely a filtr zařízení vedou do čtyř prahových skriptů, každý sestavuje Email Info pro jeden uzel Send Email


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

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.

  1. 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).
  2. Najděte uzel Message Type Switch.
  3. Sledujte linku Post telemetry vycházející z tohoto uzlu. Měla by vést k uzlu Save Timeseries.
  4. V levém menu najděte uzel Rule Chain (v kategorii Rule Chains) a přetáhněte ho na plochu.
  5. V nastavení uzlu zvolte novou Rule Chain, kterou jste právě vytvořili (například „EMAIL Notifications“).
  6. Tažením vytvořte spojení z uzlu Save Timeseries do nově přidaného uzlu Rule Chain.
  7. Jako popisek linky zvolte Success.
  8. 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í.)

Detail Root Rule Chain: uzel Save Timeseries spojený linkou Success s uzlem rule chain pro e-mailové notifikace

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:

Upravená Rule Chain: Get Last Email Time vede do prahových filtrů; každá větev True navíc ukládá atribut s časem posledního e-mailu

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.