-
Notifications
You must be signed in to change notification settings - Fork 1
Dokumentacja techniczna
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ń
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
|
Klasa SmartHomeLauncher uruchamia aplikację w trzech krokach:
-
Inicjalizacja backendu – tworzenie
NetworkManager,SHManager,UserDevice - Ustawienie Look & Feel systemu operacyjnego
-
Uruchomienie GUI – okno
SimulationFrame(administrator) orazUserUI(użytkownik)
private static void setupBackend() {
networkManager = new NetworkManager();
shManager = new SHManager(networkManager);
userDevice = new UserDevice(true, networkManager, shManager);
userDevice.leaseIP();
}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) |
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).
Centralny router sieciowy zarządzający pulą adresów IP (192.168.0.2 – 192.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
|
Żą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 [])]
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
|
Klasa abstrakcyjna dziedzicząca po NetworkDevice. Każde urządzenie SmartHome po inicjalizacji automatycznie odnajduje SHManager przez broadcast (FINDSHMANAGER) i rejestruje się w nim.
| 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.0–1.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.0–1.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 |
Centralny zarządca urządzeń SmartHome. Odpowiada za rejestr urządzeń i mechanizm logiki automatyzacji.
| 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 |
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
| 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).
| 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ł |
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]
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)
| 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 |
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.
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.0–1.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 |