====== Miniprojekty ====== Cílem miniprojektů je vytvořit komplexní IoT aplikaci, na které bude možné experimentálně ověřit probírané technologie a postupy. Miniprojekty je možné odevzdat do konce 14. týdne (24.5. 2024), preferujeme dřívější odevzdání :-) Miniprojekty by měly být odevzdány prostřednictvím fakultního [[http://gitlab.fel.cvut.cz|gitlabu]], případně jiné služby, např. GitHub. Vždy he třeba, aby byl projekt dostupný, v případě fakultního repozitáře bude mít nastavenou viditelnost buď ''internal'' nebo ''public''. Do BRUTE pak nahrajte do příslušného miniprojektu (MP01, MP02, ...) textový soubor s linkem na implementaci miniprojektu, případně doplňující informace. ===== Zadání 1. miniprojektu ===== Navrhněte Flask aplikaci pro sledování teploty s pomocí knihovny Bootstrap a template enginu Jinja. Projekt vytvořte s pomocí virtuálního prostředí (viz cv01) a následně jej nahrajte na [[https://gitlab.fel.cvut.cz|fakultní Gitlab]]. Do [[https://cw.felk.cvut.cz/brute|BRUTE]] následně nahrajte odkaz na tento repozitář, který bude mít nastavenou viditelnost buď ''internal'' nebo ''public''. * V aplikaci budou existovat tři stránky: přihlašovací formulář, registrační formulář, dashboard. * Aplikace bude využívat [[https://jinja.palletsprojects.com/en/3.0.x/templates/#template-inheritance|dědičnost šablon]] pro ''navbar'' a tělo stránky. * V navbaru bude uveden: název stránky, název přihlášeného uživatele (zatím libovolný text, který se bude předávat šablon jako proměnná), tlačítko pro odhlášení. * Na stránce dashboard vytvořte layout z komponent knihovny Bootstrap. V layoutu musí být zohledněna oblast pro: * výpis poslední naměřené hodnoty s časem zápisu, * výpis tabulky ''X'' posledních naměřených hodnot s časem zápisu a ovládacím prvkem pro proměnnou ''X'', * ovládací prvek pro smazání ''Y'' prvních (nejstarších) hodnot, * další komponenty dle vašeho uvážení (např. graf průběhu teploty v závislosti na čase, zobrazení počtu dat, apod.) * Naměřené hodnoty simulujte [[https://pythonexamples.org/python-list-of-dictionaries/|Python slovníkovým seznamem]] definovaným v serverové aplikaci (alespoň 5 záznamů ''{"timestamp": value, "temp": value}''). ===== Zadání 2. miniprojektu ===== Implementujte do stávající Flask aplikace REST API * URI endpointy pro API oddělte od ostatních endpointů do vlastního ''api_routes.py'' souboru. * Endopointy budou mít prefix ''/api/''. Funkce API: * Vložení hodnoty ''{“timestamp”: value, “temp”: value}'' pomocí vhodně zvolené metody. Hodnotu ''timestamp'' můžete generovat automaticky na serveru. * Získání poslední hodnoty ''{“timestamp”: value, “temp”: value}''. * Získání posledních ''X'' naměřených hodnot. * Smazání nejstarších ''Y'' naměřených hodnot. * Další funkce dle vašeho uvážení Odevzdání: * Ukázat funkční aplikaci na cvičení, * Nahrát na fakultní GitLab (commit již existujícího projektu), * Do brute nahrát url na commit. ===== Zadání 3. miniprojektu ===== Rozšiřte svou aplikaci o SQLite databázi. Hodnoty místo slovníkového seznamu ukládejte do tabulky v databázi. Dokončete systém přihlašování a registrace uživatelů. * Unordered List ItemDatabáze bude mít alespoň 2 tabulky: data, users * V tabulce data se budou nacházet (zatím nasimulované - náhodné) hodnoty teploty (datový typ = REAL) a timesptamp ve standardním formátu. * V tabulce data se budou nacházet záznamy uživatelů. Heslo uživatele **nesmí** být ve formě otevřeného textu - použijte libovolný šifrovací mechanizmus (např. sha256) * Pro práci s databází použijte modul sqlite3 nebo flask-SQLAlchemy * Nezapomeňte otestovat funkčnost přístupu k databázi jak prostřednictvím webové aplikace, tak i vašeho API V tuto chvíli by měla být vaše aplikace hotová a pro budoucí úkoly by nemělo být nutné aplikaci nijak upravovat. Odevzdání: * Ukázat funkční aplikaci na cvičení, * Nahrát na fakultní GitLab (commit již existujícího projektu), * Do brute nahrát url na commit. ===== Zadání 4. miniprojektu ===== Naprogramujte Raspberry Pi Pico tak, aby s intervalem 20 sekund vygenerovalo náhodnou hodnotu datového typu Real (simulace měření teploty). Tuto hodnotu zapište na sériové rozhraní, odkud to flask aplikace přečte a zapíše do databáze. Data by měla být dostupná pomocí REST API, nebo UI, které jsou naprogramované na vašem webovém serveru. BONUS: * Vyzkoušejte obousměrnou komunikaci. Např. pomocí webového rozhraní měnte periodu generování dat v rpi * Implementujte kontrolu komunikace - pokud po 20 sekundách nepříjde nová hodnota, zobrazte na webu varování. ===== Zadání 5. miniprojektu ===== Rozšiřte svou IoT platformu o podporu MQTT komunikace přes internet. Vytvořte program pro Raspberry Pi Pico W který se přípojí k dostupné Wi-Fi sítí pomocí které bude Pico publikovat zprávy s daty (timestamp, teplota) do MQTT topicu. Z tohoto topicu bude Flask aplikace odebírat zprávy nad kterými provede kontrolu, zda jsou ve správném formátu. Pokud budou data správně formátovaná, pak se uloží do databáze a budou dostupna skrze webové rozhraní i REST API. MQTT komunikace NENAHRAZUJE UART komunikaci. Bude možné posílat data jak prostřednictvím MQTT, tak i UART. Bonus: * Vytvořte obousměrnou komunikaci tak, aby bylo možné měnit periodu odesílání dat z Raspberry Pi * Do webového rozhraní implemetujte indikaci komunikace na rozhraní. Na webovém rozhraní bude zobrazeno, jaké komunikační rozhraní je aktivní (UART, MQTT) a kdy z daného rozhraní přišla poslední data ===== Zadání 6. miniprojektu =====