Simulace chytré domácnosti s uživateli, místnostmi a zařízeními (senzory, spotřebiče, sportovní vybavení). Generuje reporty (konfigurace domu, spotřeba, události, aktivita uživatelů) a demonstruje návrhové vzory.
- Stažení závislostí a build:
./gradlew clean build
- Spuštění simulace (výchozí scénář ze zadání):
Hlavní třída:
./gradlew run
cz.cvut.fel.omo.golyakat_aschehub.smarthome.Main(spouštíSimulationRunner). - Konfigurace a logy:
- Logování:
src/main/resources/log4j2.xml(výstup do konzole a souborů dle konfigurace). - Parametr simulace (počet kroků) je nastaven v
Mainpři vytvářeníSimulationRunner;
- Logování:
- Singleton + Observer:
EventManagerjako centrální publisher;EventListenerodběratelé se registrují a dostávají události. - State:
Device(stavON(IDLE)/OFF/IN_USE) aUser(WAITING/USING_DEVICE/DOING_SPORT) mají stavovou logiku pro validní přechody. - Visitor: Reporty prochází strom
House→Floor→Room→Device(např.ActivityAndUsageReportVisitor). - Observer:
UseraHouseControllerposlouchají události zEventManagera reagují na ně. - Iterator: Samostatné iterátory pro zařízení a uživatele usnadňují průchod strukturou.
- Factory:
DeviceFactoryvytváří konkrétní zařízení podleDeviceTypebez vazby na implementaci. - Builder: Konfigurace domu (patra, místnosti, zařízení, uživatelé).
- Stream API: Například ve třídě
Userv metodětryToUseDevicenebo v konstruktoruDeviceIterator
House will have two iterators:
- one for all devices (it will simplify the navigation through the location
hierarchy)
- ActivityAndUsageReport will use this iterator to get activity stats from each device
- one for all users
EventManager(Singleton, Lazy Initialization, Observer)- Centrální bod systému. Spravuje seznam odběratelů, rozesílá jim události a ukládá historii všech proběhlých akcí.
EventPool(Object Pool, Singleton)- Optimalizuje využití paměti tím, že recykluje objekty
Event. Zabraňuje zbytečnému vytváření a mazání instancí (Garbage Collection overhead) při vysoké frekvenci událostí.
- Optimalizuje využití paměti tím, že recykluje objekty
EventSource- Rozhraní pro zdroje událostí (např. senzory, uživatelé). Zdroje nevytvářejí nové instance, ale "půjčují" si prázdné události z
EventPoola posílají je doEventManager.
- Rozhraní pro zdroje událostí (např. senzory, uživatelé). Zdroje nevytvářejí nové instance, ale "půjčují" si prázdné události z
Stream(Stream API)- Nástroj, který
EventManagervyužívá k efektivní filtraci odběratelů (např. podle typu události) a k agregaci dat pro generování reportů.
- Nástroj, který
Základní struktura aplikace je postavena na kompozici objektů. Hlavní třída House agreguje (vztah 1..) instance
Floor. Každá instance Floor dále agreguje (1..) Room. Tím je vytvořena jasná hierarchie Dům -> Patro -> Místnost.
Každý Device je poté asociován s právě jednou Room (vztah located in) a každý User je v daný okamžik také spojen
s jednou Room. Což slouží k automatizacím a kontextovému chování (např. User může ovládat pouze zařízení ve své
aktuální místnosti).
Všechna chytrá zařízení (jako SmartWindow, Television, Stove atd.) jsou implementována jako konkrétní třídy
dědící z abstraktní třídy Device.
- Vytváření zařízení je řešeno pomocí návrhového vzoru Factory. Třída
DeviceFactorymá metoducreateDevice(DeviceType), která na základě enum hodnotyDeviceType(např.SMART_LIGHT,SENSOR,REFRIGERATOR) vrací správnou instanci konkrétního zařízení. Pokud bude při vytváření potřeba složitější logika, může dojít k implementaci samostatných Factory tříd pro různá zařízení. - Stav zařízení (např.
ON,OFF,IN_USE) je reprezentován enum výčtemDeviceState. Jak je poznačeno v diagramu, k řízení přechodů mezi těmito stavy je použit návrhový vzor State. To zajišťuje, že se zařízením nelze interagovat neplatným způsobem (např.setChannelvTelevision, která jeOFF). - Spotřeba je spravována přes enum
ConsumptionType(např.ELECTRICITY,WATER). KaždéDevicemá metodugenerateConsumptionReport()pro hlášení své spotřeby.
Členové domácnosti jsou reprezentováni třídou User.
- Role a Oprávnění: Každý
Usermá atributroledefinovaný enum výčtemRole(např.ADMIN,CHILD,PET). Oprávnění k interakci se zařízením je řízeno porovnánímUser.roles atributemDevice.canBeUsedBy. - Stav Uživatele: Podobně jako zařízení, i
Uservyužívá návrhový vzor State pro správu svého chování. enumUserState(WAITING,USING_DEVICE,DOING_SPORT) definuje, co uživatel právě dělá. - Interakce: Uživatelé interagují s prostředím voláním metod
useDevice(Device)nebouseEquipment(SportsEquipment).SportsEquipment(jakoSkiaBicycle) jsou samostatné třídy, ke kterým lze přistupovat přesHouse.
Systém událostí je klíčovou součástí a je implementován pomocí návrhového vzoru Observer.
- Zdroje: Třídy
UseriDeviceimplementují rozhraníEventSource, které jim dává metodugenerateEvent(String, EventPriority). Tím mohou vytvářet události (např. "Pes odešel ven", "Sensor detekuje déšť"). - Centrální Manager: Třída
EventManagerje implementována jako Singleton. Funguje jako centrální "subject" (vydavatel). Udržuje si seznam odběratelů a upozorňuje je, když je publikována nová událost. - Pub/Sub: Ostatní objekty (uživatelé nebo zařízení) se mohou u
EventManagerzaregistrovat pomocísubscribe()aunsubscribe(). - Tok Události:
Device(např.WindSensor) neboUserzavolápublishEvent().EventManagerpřijme tentoEventa uloží jej do paměti i do souborového logu.EventManagernásledně rozešle (notifikuje) tuto událost všem svým přihlášeným odběratelům (UserneboDevice), kteří na ni mohou reagovat.- Když je událost vyřízena, může ji odběratel označit jako vyřízenou a z
EventManagerji odebrat.
Generování reportů je rozděleno mezi odpovědné třídy:
HouseConfigurationReport: Je generován voláním metodygenerateHouseConfigurationReport()na instanciHouse. Jak je uvedeno v poznámce diagramu, pro sběr dat ze stromové struktury (House -> Floor -> Room -> Device) bude použit návrhový vzor Visitor.EventReport: GenerujeEventManagerze svého souborového logu událostí.ActivityAndUsageReport: Generuje každýUserna základě historie voláníuseDevice/useEquipment. A celkový report může být agregován na úrovniHousepomocí iterátoru pro uživatele.ConsumptionReport: Generuje každéDevicepro sebe.


