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:
YYYY-MM-DD'T'hh:mm:ss.sTZD
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,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