====== 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 =====