Skip to content

Dokumentacja techniczna

jaceksawinskitm1 edited this page Mar 18, 2026 · 5 revisions

Opis techniczny

SmartHome jest prototypem systemu zarządzania urządzeniami smart, łączący warstwę frontendową, w postaci interfejsu użytkownika, z backendem, który symuluje rzeczywiste środowisko. System został zaprojektowany w sposób mający umożliwić jak najprostszą migracje na prawdziwe urządzenia, poprzez m.in. symulowanie sieci LAN po której urządzenia się komunikują, co umożliwia wykorzystanie różnych języków programowania przy tworzeniu nowego backendu lub frontendu.

Aplikacja oferuje:

  • Graficzne rozmieszczanie urządzeń na kanwie (tryb grafu)
  • Odczytywanie stanu urządzeń w czasie rzeczywistym
  • Sterowanie każdym urządzeniem z osobna
  • Tworzenie automatyzacji przez warunkowe połączenie urządzeń (logika if-then)
  • Okno symulacji (SimulationFrame) umożliwiające bezpośrednią manipulację stanem urządzeń

1. Ogólny schemat

smarthome

2. Architektura systemu

System podzielony jest na trzy główne pakiety:

Pakiet Rola Kluczowe klasy
Network Warstwa komunikacji sieciowej NetworkManager, NetworkDevice, IP, UserDevice
Devices Urządzenia SmartHome i manager SHDevice, SHManager, + 12 urządzeń
UI Graficzny interfejs użytkownika UserUI, GraphPanel, GraphModel, Node, Edge

2.1 Przepływ inicjalizacji

Klasa SmartHomeLauncher uruchamia aplikację w trzech krokach:

  1. Inicjalizacja backendu – tworzenie NetworkManager, SHManager, UserDevice
  2. Ustawienie Look & Feel systemu operacyjnego
  3. Uruchomienie GUI – okno SimulationFrame (administrator) oraz UserUI (użytkownik)
private static void setupBackend() {
    networkManager = new NetworkManager();
    shManager = new SHManager(networkManager);
    userDevice = new UserDevice(true, networkManager, shManager);
    userDevice.leaseIP();
}

3. Warstwa sieciowa (pakiet Network)

3.1 Klasa IP

Reprezentuje adres IPv4 przechowywany jako 32-bitowa liczba całkowita. Obsługuje broadcast: ostatni oktet równy 255 dopasowuje dowolny adres w podsieci.

Metoda Opis
getAddressString() Zwraca adres w postaci "A.B.C.D"
setAddress(byte[]) Ustawia adres z tablicy 4 bajtów
equals(Object) Porównanie z obsługą broadcast (.255)

3.2 Klasa NetworkDevice

Klasa bazowa dla wszystkich urządzeń sieciowych. Zarządza adresem IP i rejestrem kodów sieciowych (obsługiwanych komend).

Kody sieciowe rejestrowane są przez przeciążoną metodę registerNetworkCode():

// Getter – bez parametrów, zwraca wartość
registerNetworkCode("GET_STATE", "BOOL", () -> String.valueOf(isOn));

// Setter – przyjmuje parametry
registerNetworkCode("SET_STATE", "BOOL", (String[] params) -> {
    this.isOn = params[0].equals("true");
});

Format klucza kodu: NAZWA<TYP>, gdzie TYP to: BOOL, INT, FLOAT, RANGE, STRING, COLOR, TIME, NULL.

Specjalna komenda ADVERT zwraca listę wszystkich publicznych kodów urządzenia (służy do autodiscovery w UI).

3.3 Klasa NetworkManager

Centralny router sieciowy zarządzający pulą adresów IP (192.168.0.2192.168.0.254) i kierujący żądaniami do właściwych urządzeń.

Metoda Opis
leaseIP(NetworkDevice) Przydziela wolny adres IP urządzeniu
freeIP(IP) Zwalnia adres IP
createRequest(...) Tworzy obiekt Request
getBroadcastAddress() Zwraca adres 192.168.0.255

Format żądania sieciowego

Żądania przyjmują formę tekstową: KOD ŹRÓDŁO CEL [PARAM1,PARAM2,...]

SET_POWER 192.168.0.254 192.168.0.5 [75.0]
GET_TEMPERATURE 192.168.0.254 192.168.0.3 []

Obsługiwane są też żądania zagnieżdżone z składnią $(...):

SET_POWER 192.168.0.1 192.168.0.5 [$(GET_TEMPERATURE 192.168.0.1 192.168.0.3 [])]

3.4 Klasa UserDevice

Reprezentuje urządzenie użytkownika w sieci. Obsługuje kolejkowanie żądań gdy brak dostępu do LAN – po ponownym połączeniu wysyła je automatycznie.

Metoda Opis
sendRequest(IP, code, params[]) Wysyła żądanie i zwraca wynik
connectToLan() / disconnectFromLan() Zarządza stanem połączenia
showUI() Tworzy i wyświetla okno UserUI

4. Urządzenia (pakiet Devices)

4.1 Klasa SHDevice

Klasa abstrakcyjna dziedzicząca po NetworkDevice. Każde urządzenie SmartHome po inicjalizacji automatycznie odnajduje SHManager przez broadcast (FINDSHMANAGER) i rejestruje się w nim.

4.2 Katalog urządzeń

Urządzenie Kody sieciowe Opis funkcjonalności
Light GET/SET_STATE, GET/SET_BRIGHTNESS, GET/SET_COLOR Żarówka z regulacją jasności i koloru (HEX)
Heater GET/SET_STATE, GET/SET_POWER Grzejnik z regulacją mocy (0.01.0)
AirConditioner GET/SET_STATE, GET/SET_POWER Klimatyzator z regulacją mocy chłodzenia
Thermometer GET_TEMPERATURE Czujnik temperatury (tylko odczyt)
Clock GET_TIME Zegar symulujący upływ czasu (1s/s), format ISO
Alarm GET/SET_DURATION, RING, GET_STATUS Alarm z odliczaniem; stany: IDLE, RINGING, DONE
CoffeeMachine GET_STATUS, GET_PROGRESS, COFFEE Ekspres do kawy; stany: IDLE, GRINDING, READY
TV GET/SET_STATUS, GET/SET_VOLUME, GET/SET_CHANNEL Telewizor z kanałami i głośnością (0.01.0)
AudioDevice GET/SET_VOLUME, MUTE Urządzenie audio z wyciszeniem
Blind GET/SET_STATUS Żaluzja: otwarta/zamknięta
GarageDoor GET/SET_POSITION, GET_STATE Brama garażowa; pozycja 0.0=otwarta, 1.0=zamknięta
CCTV GET_MOVEMENT Kamera bezpieczeństwa z detekcją ruchu
LightDetector GET/SET_NIGHT Czujnik oświetlenia: dzień/noc

4.3 Klasa SHManager

Centralny zarządca urządzeń SmartHome. Odpowiada za rejestr urządzeń i mechanizm logiki automatyzacji.

Zarządzanie urządzeniami przez sieć

Komenda Parametry Opis
ADD_DEVICE [ip, id] Rejestruje urządzenie pod podaną nazwą
DEL_DEVICE [ip] Usuwa urządzenie i powiązane reguły logiki
RENAME_DEVICE [old_id, new_id] Zmienia identyfikator urządzenia
GET_DEVICES Zwraca listę adresów IP wszystkich urządzeń
GET_DEVID [ip] Zwraca identyfikator urządzenia po jego adresie IP

5. System automatyzacji (Logika)

SHManager zawiera mechanizm reguł if-then, uruchamianych w tle co 500 ms. Każda reguła składa się z:

  • Komparatora (Comparator) – sprawdza warunek na urządzeniu A
  • Akcji (DeviceLogic) – wysyła komendę do urządzenia B gdy warunek jest spełniony

5.1 Comparator – dostępne warunki

Warunek Operator
EQUAL wartość == stała
NOT_EQUAL wartość != stała
GREATER_THAN wartość > stała
LESS_THAN wartość < stała
GREATER_EQUAL wartość >= stała
LESS_EQUAL wartość <= stała

Komparator obsługuje porównania liczbowe (double) oraz czasowe (LocalTime).

5.2 Zarządzanie regułami przez sieć

Komenda Parametry Opis
ADD_LOGIC action_ip, action_code, action_params, cond_ip, cond_code, cond_type, cond_val, priority Dodaje nową regułę automatyzacji
DEL_LOGIC [logic_id] Usuwa regułę o podanym ID
GET_LOGICS Zwraca listę wszystkich aktywnych reguł

5.3 Przykłady automatyzacji

Kamera wykrywa ruch → włącza lampę:

ADD_LOGIC [lamp_ip, SET_STATE, [true], cctv_ip, GET_MOVEMENT, EQUAL, true, 1]

Grzejnik włącza się gdy temperatura spada poniżej 20°C:

ADD_LOGIC [heater_ip, SET_STATE, [true], thermo_ip, GET_TEMPERATURE, LESS_THAN, 20.0, 1]

Żaluzje zamykają się o zachodzie słońca (po 20:00):

ADD_LOGIC [blind_ip, SET_STATUS, [false], clock_ip, GET_TIME, GREATER_EQUAL, 20:00:00, 1]

6. Interfejs użytkownika (pakiet UI)

6.1 UserUI – główne okno

Okno użytkownika wyświetla grafowe rozmieszczenie urządzeń. Oferuje:

  • Skanowanie sieci i wyświetlanie znalezionych urządzeń jako węzłów grafu
  • Konfiguracja urządzenia po kliknięciu węzła: odczyt i zmiana parametrów
  • Zmiana nazwy lub usunięcie urządzenia z managera
  • Tworzenie połączeń (krawędzi grafu) między urządzeniami w postaci reguł logiki
  • Wizualne podświetlanie aktywnych reguł (highlightLogic)

6.2 GraphPanel i model grafu

Klasa Rola
GraphModel Przechowuje listę węzłów i krawędzi
GraphPanel Renderuje graf, obsługuje zdarzenia myszy
Node Węzeł grafu: adres IP urządzenia, etykieta, pozycja
Edge Krawędź grafu: węzeł A, węzeł B, ID reguły logiki

6.3 SimulationFrame – okno administratora

Okno symulacji dostępne wyłącznie dla dewelopera/administratora. Umożliwia bezpośrednią manipulację stanem urządzeń z pominięciem warstwy sieciowej. Typowe zastosowania: testowanie scenariuszy, ręczna zmiana temperatury, symulacja ruchu w kamerze CCTV.


7. Typy danych w kodach sieciowych

Każdy kod sieciowy posiada zadeklarowany typ, który UI wykorzystuje do generowania odpowiedniego komponentu:

Typ Komponent UI Opis
BOOL JCheckBox / Toggle Wartość logiczna true/false
INT JSpinner Liczba całkowita
FLOAT JLabel (read-only) Liczba zmiennoprzecinkowa
RANGE JSlider Zakres ciągły (0.01.0 lub szerzej)
STRING JLabel / JTextField Tekst dowolny
COLOR JColorChooser Kolor w formacie HEX (#RRGGBB)
TIME TimeInput Czas w formacie ISO (HH:mm:ss)
NULL JButton Komenda bez parametrów/wyników