2. Miniprojekt

Navrhněte a implementujte asynchronní distribuovaný systém sestávající z koncového IoT zařízení (Raspberry Pi Pico W) a webové aplikace (Flask). Komunikace mezi koncovým zařízením a serverem nesmí probíhat napřímo (např. pomocí HTTP požadavků), nýbrž musí být plně zprostředkována protokolem MQTT.

1. Telemetrie, NTP synchronizace a garance doručení (4 body): Koncové zařízení se bezprostředně po startu připojí k síti Wi-Fi a synchronizuje svůj interní čas prostřednictvím protokolu NTP (využijte např. server tik.cesnet.cz). Následně naváže spojení s MQTT brokerem. V přesně dodržovaném periodickém intervalu (10 sekund) dojde ke sběru dat (DHT22, nebo integrovaný teploměr) a publikaci payloadu na téma cvut/nsi/2026/<cvut_login>/telemetry s vyžadovanou garancí doručení QoS úrovně 1. Publikovaný payload musí být ve formátu JSON a musí povinně obsahovat:

  • timestamp odpovídající času na začátku měření ve formátu ISO 8601 YYYY-MM-DD'T'hh:mm:ss.sTZD
  • doba běhu zařízení od posledního startu v sekundách (uptime)
  • aktuální stav LED
  • naměřená data z teploměru

2. Odebírání témat (4 body): Koncové zařízení musí asynchronně naslouchat a reagovat na řídicí zprávy. Bude odebírat téma cvut/nsi/<cvut_login>/led a cvut/nsi/2026/+/telemetry.

  • cvut/nsi/2026/<cvut_login>/led: Přijetí příkazu ON/OFF/TOGGLE (case insensitive) provede okamžitou změnu stavu LED.
  • cvut/nsi/2026/+/telemetry: Pokud zařízení v přijatém payloadu od cizího zařízení detekuje teplotu vyšší než 30 °C, provede varovnou indikaci (třikrát rychle blikne s periodou přesně 100 ms).

3. Dashboard (3 body): Implementujte backendovou aplikaci (Flask), která na pozadí odebírá telemetrická data z brokera. Aplikace vykresluje webový dashboard s aktuálními daty koncového zařízení. Rozhraní dále obsahuje HTML formulář pro vzdálenou změnu periody měření. Formulář odesílá data na dedikovaný Flask endpoint s URL parametrem /update_telemetry_period?period=X. Flask musí tento parametr validovat. Pokud parametr chybí, nebo se nejedná o celé číslo v rozsahu 1 sekunda až 5 minut (včetně krajních hodnot), požadavek bude serverem odmítnut a uživateli se zobrazí chybové hlášení. V případě validního vstupu odešle Flask příslušný MQTT příkaz na téma cvut/nsi/2026/<cvut_login>/period. Koncové zařízení následně aktualizuje periodu pro měření dat a odesílání telemetrie. Součástí telemetrie bude také aktuálně nastavená perioda měření.

4. Konfigurace a bezpečnost prostředí (2 body): Hodnoty související s prostředím a bezpečností (zejména citlivé údaje) nesmí být deklarovány přímo v kódu. Serverová část musí využívat soubor .env. Koncové zařízení musí využívat dedikovaný konfigurační soubor secrets.json nebo config.py. Je vyžadováno opatření proti úniku citlivých dat do verzovacího systému. V odevzdaném repozitáři musí být přítomny pouze bezpečné šablony obsahující výchozí či prázdné hodnoty.

5. Správa klientských relací (2 body): Webový dashboard bude obsahovat přepínač pro volbu preferované jednotky teploty (Celsius / Fahrenheit). Tato preference bude uložena v klientské relaci. Při dalším přístupu na stránku (nebo po obnovení klávesou F5) server relaci přečte a šablonu vykreslí s ohledem na zvolenou jednotku. Aplikace musí respektovat princip Fail-Fast – při absenci kryptografického klíče v prostředí musí dojít k okamžitému pádu serveru při startu.

BONUS (+3 body): Zajištění integrity stavu pomocí Last Will and Testament (LWT). Z pohledu webového dashboardu není zřejmé, zda je Pico W aktuálně připojeno k síti, nebo zda došlo k výpadku napájení/Wi-Fi. Nakonfigurujte instanci MQTT klienta na koncovém zařízení tak, aby při připojování k Brokeru definoval zprávu poslední vůle (LWT). V moment, kdy se zařízení korektně spustí a připojí se, publikuje na téma cvut/nsi/2026/<cvut_login>/status zprávu 'ONLINE'. Pokud dojde k neočekávané ztrátě spojení, bude publikována LWT zpráva 'OFFLINE'. Server toto téma odebírá a na dashboardu jasně vizualizuje, zda je systém dostupný, či nikoliv.

Do systému BRUTE odevzdávejte textový soubor s odkazem na váš commit v GitLabu. V odevzdaném miniprojektu se očekává minimálně následující struktura:

  • main_rpi.py - firmware pro Raspberry Pi Pico W,
  • main_server.py - Řídicí skript pro PC,
  • templates/ - adreář obsahující HTML šablony,
  • šablony konfiguračních souborů pro server a koncové zařízení,
  • requirements.txt - seznam Python závislostí
  • README.md - Stručná dokumentace obsahující instrukce ke spuštění a případně poznámky k implementaci,
  • .gitignore
courses/b0b37nsi/miniprojects/02.txt · Last modified: 2026/04/13 12:22 by zourefil