====== 🏠 Smart Home ====== {{ :courses:b6b36omo:sem:smart_home.png?nolink&350|}} Vytvořte aplikaci pro virtuální simulaci inteligentního domu, skládajícího se z chytrých zařízení, umístěných v různých místnostech. Ta jsou schopna monitorovat okolní prostředí a sledovat svůj stav, spotřebu apod. Se všemi zařízeními je možné interagovat jak systémově, tak uživatelsky (jednotlivými členy domácnosti). Součástí aplikace je i předpřipravená konfigurace domu, na které jsou ukázány implementované požadavky. ===== ⚙️ Funkční požadavky ===== ==== Povinné ==== - Aplikace obsahuje alespoň 8 typů spotřebičů, jako např. televize, senzor, myčka, chytré okno apod. Každé zařízení je umístěno v konkrétním pokoji, nacházejícím se v jednom patře domu (případně v garáži, na zahradě apod.). - Interakce se zařízeními probíhá přes API; primárně interakcí uživatele (člena domácnosti) – //zapnu televizi//, //naplním ledničku// apod. Základní funkce lze ovládat i systémově – např. //blíží se bouřka - vypnu všechna el. zařízení//. - Interakcí se zařízením dochází ke změně jeho stavu, který ovlivňuje jak s ním můžu interagovat dále – např. //nemohu si uvařit oběd, pokud je vypnutý sporák//. Některá zařízení mohou mít obsah – např. //lednice má jídlo//, //CD přehrávač má CD// apod. - Každý člen domácnosti má předem definované, jaká zařízení a jak s nimi může interagovat; //kočka nemůže zapnout myčku//, //jen tatínek opraví televizi// apod. - Rodina je aktivní a volný čas tráví zhruba v poměru 50 % používání spotřebičů v domě a 50 % sportem (kolo, lyže). Pokud není volné zařízení nebo sportovní náčiní, osoba čeká. - Každé zařízení má spotřebu (elektřiny, vody, plynu apod.); spotřeba se dá zjistit pomocí vystaveného API. - Zařízení a osoby se v každém okamžiku nacházejí v jedné místnosti, a náhodně generují události (eventy), které mohou být důležitou informací nebo upozorněním (alertem). - Události jsou odbavovány vhodnou osobou nebo zařízením. Například: * Čidlo na vítr → vytažení venkovních žaluzií * Jistič (výpadek elektřiny) → vypnutí všech nedůležitých spotřebičů (v provozu zůstávají pouze ty nutné) * Čidlo na vlhkost (prasklá trubka) → máma: zavolání hasičů, táta: uzavření vody, dcera: vylovení křečka * Miminko potřebuje přebalit → táta se skrývá, máma: přebalení * Zařízení přestalo fungovat → ... * V lednici došlo jídlo → ... - Aplikace je schopna na konci běhu vygenerovat následující reporty: * ''HouseConfigurationReport'' obsahuje veškerá konfigurační data domu v hierarchii (např. dům → patro → místnost → okno → žaluzie), včetně členů domácnosti. * ''EventReport'' obsahuje seznam událostí (viz výše), seskupené podle typu, zdroje a cílové entity (kdo událost odbavil). * ''ActivityAndUsageReport'' obsahuje informace o tom, kolikrát která osoba použila které zařízení. * ''ConsumptionReport'' informuje o spotřebě (vody, plynu, elektřiny apod.) jednotlivých zařízení. - Pro aplikaci je předpřipravená jedna názorná konfigurace domu, která obsahuje minimálně: * 6 členů domácnosti; každý může mít v domě jiná oprávnění * 20 kusů spotřebičů; alespoň 10 různých druhů * 5 kusů sportovního náčinní * 6 místností + venkovní prostor (zahrada, dvorek) ==== Bonusové ==== - Spotřebiče mají životnost, která s časem klesá; zařízení se tedy může rozbít. Vybraní členové domácnosti mohou zařízení opravit; oprava má vyšší prioritu než volnočasové aktivity. Dokud není zařízení opraveno, nemůže být používáno členy domácnosti a nereaguje na systémové ovládání. - Pokud domácnost zjistí, že je některých zařízení nedostatek, může si do domu pořídit nové. ===== 📐 Nefunkční požadavky ===== - Není požadována autentizace ani autorizace. - Aplikace může běžet pouze v jedné JVM. - Metody a proměnné, které nemají být dostupné ostatním třídám, mají být dobře skryté. Vygenerovaný Javadoc by měl obsahovat co nejméně public metod a proměnných. - Reporty jsou generovány do textového souboru. - Konfigurace domu, zařízení a obyvatel může být načítána přímo z třídy nebo externího souboru (preferován je JSON). ===== 🧩 Vhodné design patterny ===== * State machine * Iterator * Factory / Factory method * Decorator * Singleton * Visitor * Observer * Chain of Responsibility * Partially persistent data structure * Object Pool * Lazy Initialization * Monáda (2 body místo jednoho za implementaci vlastní monády) * Streamy ===== 📚 Doporučená literatura ===== * https://www.ikea.com/cz/en/cat/smart-home-hs001/ * https://www.alza.cz/zigbee