Skip to content
Snippets Groups Projects
Verified Commit c8b86308 authored by Nádudvari Ákos's avatar Nádudvari Ákos
Browse files

chore(tervezés): diagramok

parent 8bc5b98c
No related branches found
No related tags found
No related merge requests found
Pipeline #2721 passed
......@@ -30,7 +30,8 @@ in
biblatex-ieee ly1 metafont transparent catchfile microtype
l3kernel l3packages texcount moreverb pdfpages pdflscape
tabularray ninecolors minted fvextra latex2pydata
newfloat pdftexcmds pgfkeyx pgfopts upquote lineno;
newfloat pdftexcmds pgfkeyx pgfopts upquote lineno
luainputenc luatexbase hyphen-hungarian;
});
};
document.font = mkOption {
......
% Ez a fájl felelős azért, hogy a projekt fájljait összefűzze egy kimeneti pdf-fé.
% Ezeket írd át...
\def\tipus{\textbf{Szakdolgozat}} % --> ha MSc-s vagy, írd át "DIPLOMAMUNKA"-ra!
\def\nev{Nádudvari Ákos}
\def\kepzes{Mérnökinformatikus BSc}
\def\cim{\textsl{ESP32 alapú biztonsági rendszer tervezése és megvalósítása Rust nyelv használatával, okosotthon-integrációval}}
\def\temavezetok{Témavezető:\\Tihanyi Attila Kálmán}
%TC:ignore
% címlap generálása
......
......@@ -25,7 +25,7 @@ Ahhoz, hogy ezt a dolgozatban belátható keretek között lehessen értelmezni,
megkötéseket és elvárásokat helyezni a projektre, melyeket ebben a fejezetben
fektetünk le.
A dolgozat során elvégzendő feladataim:
\paragraph{}\noindent\textbf{A dolgozat során elvégzendő feladataim:}
\begin{itemize}
\item Szakirodalom alapján megismerkedni a biztonságtechnika alapjaival,
a behatolásjelző biztonságtechnikai rendszerek felépítésével.
......
......@@ -136,27 +136,35 @@ ideálisabbnak. Ezért esett rá a választás, hiszen a dolgozat keretében egy
alapot tervezek készíteni egy bővíthető rendszer számára.
Az ESP32 családjában több mikroprocesszor-architektúra is megtalálható,
nevezetesen: Xtensa, ARM és RISC-V. A legtöbb modell esetében Xtensa magok
találhatóak, mely kizárólag az ESP-k körében használatos manapság. 32 bites
ALU-val és 16 darab 32 bites általános célú regiszterrel rendelkezik, 16
bites utasításkészlet mellett (ISA). Az alap ISA 82 RISC utasítást tartalmaz.
\cite{xtensa} Az általam választott ESP32 alapú fejlesztőpanel (ESP32-D1-MINI)
az ESP32-WROOM-32 chipet használja. A chip tartalmaz 4MB beépített SPI
flash memóriát, 520KB SRAM-ot. Megítélésem szerint ez elegendő erőforrás a
fehasználásunkra, hiszen nem fogjuk használni a beépített WiFi rádiót, ami
működtetése szignifikáns ROM és RAM-ot felhasználna. \cite{esp-wroom} A chip
tartalmaz egy beépített MAC interfészt (Media Access Controller), amely 17
vezetéken (MII -- Media Independent Interface) vagy 9 (RMII -- Reduced Media
Independent Interface) vezetéken képes egy fizikai médium vezérlővel (PHY)
kommunikálni. \cite{esp} Ez esetünkben praktikus, mert csupán egy Ethernet
aljzat és PHY vezérlő elegendő Ethernet LAN hálózatokkal való integráláshoz.
Továbbá a chipen a MAC egyedi DMA (Direct Memory Access) vezérlővel működik
beépített adó és vevő oldali 512 szavas FIFO-val. Ezt alkalmazva az adatátvitel
akár $100\ Mbit/s$ sebességen tud működni. \cite{esp} Számunkra nem a sebesség
a fontos, hanem a stabilitás, megbízhatóság, melynek ezek a beépített perifériák
eleget tesznek. Az adatátvitel szoftveres kezelését a gyártó által fejlesztett
framework-ben implementált driver fogja végezni, mely kevésbé rizikósabb, mint
harmadik fél által fejlesztett megoldások.
nevezetesen: Xtensa, ARM és RISC-V. A legtöbb modell esetében Xtensa
magok találhatóak, mely kizárólag az ESP-k körében használatos manapság. A
mikrokontroller tokozásának egy általános felépítését a gyártó dokumentációja
\aref{diag:esp32}. ábrán mutatja be. A mag 32 bites ALU-val és 16 darab 32 bites
általános célú regiszterrel rendelkezik, 16 bites utasításkészlet mellett (ISA).
Az alap ISA 82 RISC utasítást tartalmaz. \cite{xtensa} Az általam választott
ESP32 alapú fejlesztőpanel (ESP32-D1-MINI) az ESP32-WROOM-32 chipet használja.
A chip tartalmaz 4MB beépített SPI flash memóriát, 520KB SRAM-ot. Megítélésem
szerint ez elegendő erőforrás a fehasználásunkra, hiszen nem fogjuk használni a
beépített WiFi rádiót, ami működtetése szignifikáns ROM és RAM-ot felhasználna.
\cite{esp-wroom} A chip tartalmaz egy beépített MAC interfészt (Media Access
Controller), amely 17 vezetéken (MII -- Media Independent Interface) vagy
9 (RMII -- Reduced Media Independent Interface) vezetéken képes egy fizikai
médium vezérlővel (PHY) kommunikálni. \cite{esp} Ez esetünkben praktikus, mert
csupán egy Ethernet aljzat és PHY vezérlő elegendő Ethernet LAN hálózatokkal
való integráláshoz. Továbbá a chipen a MAC egyedi DMA (Direct Memory Access)
vezérlővel működik beépített adó és vevő oldali 512 szavas FIFO-val. Ezt
alkalmazva az adatátvitel akár $100\ Mbit/s$ sebességen tud működni. \cite{esp}
Számunkra nem a sebesség a fontos, hanem a stabilitás, megbízhatóság, melynek
ezek a beépített perifériák eleget tesznek. Az adatátvitel szoftveres kezelését
a gyártó által fejlesztett framework-ben implementált driver fogja végezni, mely
kevésbé rizikósabb, mint harmadik fél által fejlesztett megoldások.
\begin{figure}[htbp!]
\centering
\includesvg[width=0.6\linewidth]{images/esp32_blockdiagram.svg}
\caption{Az ESP32 mikrokontrollerek általános funkcionális blokkdiagramja \cite{esp}}
\label{diag:esp32}
\end{figure}
Az Espressif fenn tart ehhez az architektúrához készült fordítóprogramokat,
melyek az ESP-IDF (Espressif IoT Development Framework) szofverfejlesztői
......@@ -197,6 +205,8 @@ tűzte ki a Rust számára, hogy a memóriakezelést tegye biztossá, biztonság
tervezésénél a magas szintű ergonómia és az alacsony szintű vezérlés gyakran
ellentétben áll egymással; a Rust szembemegy ezzel a konfliktussal.''}
\cite{rust-book} -- írja a nyelv hivatalos dokumentációja.
\Aref{tab:lang-compare}. táblázatban kigyűjtöttem összehasonlításra néhány
szempontot a Rust és valahány elterjedt programozási nyelv között.
A memóriakezelés programozási nyelvek körében általában futásidőben vagy
fordítási időben történik (pontosabban a fejlesztőre van bízva -- allokálás
......@@ -212,6 +222,40 @@ utóbbi eset; a fordítási időben való memóriakezelés már nem ilyen trivi
megoldható kérdés. A Rust is egy ilyen nyelv, és ehhez különböző megkötéseket és
módszertanokat vet be.
\begin{table}[htbp!]
\begin{tblr}{
vlines,
hlines,
colspec={X[c] X[c] X[c] X[c] X[c]},
}
\textbf{Nyelv} & \textbf{Előre fordított (AOT/JIT) / interpretált} & \textbf{Futásidejű virtuális gép (VM)} & \textbf{Garbage collector (GC)} & \textbf{Fordítási idő} \\ \hline
Javascript & JIT & igen (böngésző, Node.js) & igen & - \\
Typescript & JIT & igen (böngésző, Node.js) & igen & - \\
Python & interpretált & igen & igen (reference counting) & - \\
Java & JIT & igen (JVM) & igen (tracing) & gyorsabb \\
Go & AOT & nem & igen & gyorsabb \\
Rust & AOT & nem & nem & lassabb \\
C/C++ & AOT & nem & nem & átlagos \\
\end{tblr}
\begin{tblr}{
vlines,
hlines,
colspec={X[c] X[c] X[c] X[c] X[c]},
}
\textbf{Nyelv} & \textbf{Memóriabiztonság} & \textbf{Típusbiztonság} & \textbf{``Null'' biztonság} & \textbf{``Data race'' biztonság} \\ \hline
Javascript & van (GC) & gyenge & nincs & van (egyszálú) \\
Typescript & van (GC) & erős (strict mode alatt) & van & van (egyszálú) \\
Python & van (GC) & erős & nincs & van (egyszálú) \\
Java & van (GC) & erős & nincs & nincs \\
Go & van (GC) & erős & nincs & van \\
Rust & van (RAII, ownership) & erős & van & van \\
C++ & van, részben (RAII) & gyenge & nincs & nincs \\
C & nincs & gyenge & nincs & nincs \\
\end{tblr}
\caption{Elterjedt programozási nyelvek áttekintő összehasonlítása \cite{gh-lang-perf}}
\label{tab:lang-compare}
\end{table}
Az egyik alapvető különbség más statikus típusú, procedurális és imperatív
nyelvektől, hogy minden változó első hozzárendelése után az nem megváltoztatható
-- a változó ekkor ``immutable''. Többszöri hozzárendelés esetén a program nem
......@@ -291,9 +335,16 @@ architektúrai elemet, hogy a kliensek között legyen egyetlen szerver, elnevez
szerint a ``broker''. A broker fogadja a kliensek csatlakozási, feliratkozási,
üzenetküldési, leválasztási és egyéb kérelmeit. Nyilván tartja a klienseket,
azok jogosultságait és a topic-on közzétett üzenetek továbbítását végzi.
Az architektúra modelljét \aref{diag:mqtt}. ábrán rajzoltam le szemléltetés végett.
Számos implementációja van mind kliens oldali és broker oldali szerepeknek.
\cite{mqtt-vs-coap}
\begin{figure}[htbp!]
{\footnotesize\includesvg[width=\textwidth]{images/mqtt.drawio.svg}}
\caption{Az MQTT protokoll architektúra-modellje}
\label{diag:mqtt}
\end{figure}
Az architektúra előnye, hogy a komplex feldolgozás feladata az a broker-re van
hagyva és egy kliens működtetése minimális erőforrásokat igényel. További előnye
más megoldásokkal szemben, hogy beépített Quality of Service (QoS) megoldást
......@@ -381,6 +432,15 @@ entitás jelenlétével: Amikor mozgás van a szobában és a rendszer hatástal
van és a nap már lement, akkor kapcsolódjon fel a szobában lévő lámpa. Illetve
ha nincs mozgás legalább 10 percen át, akkor kapcsolódjon le a lámpa.
Ezzel a Home Assistant belső architektúráját magas szinten kielemeztük.
Szemléltetés céljával lerajzoltam a modellt \aref{diag:hass-arch}. ábrán.
\begin{figure}[htbp!]
{\footnotesize\includesvg[width=\textwidth]{images/hass.drawio.svg}}
\caption{A Home Assistant architektúra-modellje \cite{hass-diagram}}
\label{diag:hass-arch}
\end{figure}
Az MQTT egy első osztályú integráció a Home Assistantban. Az MQTT minden QoS
szintjét támogatja, illetve a többi integrációhoz képest sokkal általánosabb
interfészt ad. Ez kimagaslóan jobb élményt ad a végfelhasználó számára,
......@@ -407,4 +467,8 @@ felhasználó Home Assistant felületén. Ez elméletben kényelmesebb, mint pé
a WiFi konfigurációja. Ennek realitását szintén a gyakorlatban fogjuk tudni
megállapítani.
\subsection{Összesítés}
\clearpage % Ez azért kell, hogy nehogy képek átcsússzanak a következő fejezethez
\chapter{Eredmények}
\chapter{Megoldások}
% A megtervezett műszaki alkotások értékelése, kritikai elemzése, továbbfejlesztési lehetőségek.
% Blokk diagram, és annak elemein végigjárni
......@@ -117,23 +117,23 @@ kellett implelentáljam. A fizikai réteg inicializálása egyszerűen történi
\noindent\extlink{https://github.com/akosnad/rusty-esp-alarm/blob/1d3073a0cbd3b98af0f6a14bdf625732938f78e2/src/main.rs\#L103}{main.rs}
\begin{minted}[linenos,firstnumber=103]{rust}
let eth = Box::leak(Box::new(esp_idf_svc::eth::EspEth::wrap(
esp_idf_svc::eth::EthDriver::new_spi(
SpiDriver::new(
peripherals.spi2,
pins.gpio18,
pins.gpio19,
Some(pins.gpio23),
&SpiDriverConfig::new().dma(Dma::Auto(4096)),
)?,
pins.gpio26,
Some(pins.gpio5),
Some(pins.gpio33),
esp_idf_svc::eth::SpiEthChipset::W5500,
20.MHz().into(),
Some(&[0x02, 0x00, 0x00, 0xfc, 0x18, 0x01]),
None,
sysloop.clone(),
)?,
esp_idf_svc::eth::EthDriver::new_spi(
SpiDriver::new(
peripherals.spi2,
pins.gpio18,
pins.gpio19,
Some(pins.gpio23),
&SpiDriverConfig::new().dma(Dma::Auto(4096)),
)?,
pins.gpio26,
Some(pins.gpio5),
Some(pins.gpio33),
esp_idf_svc::eth::SpiEthChipset::W5500,
20.MHz().into(),
Some(&[0x02, 0x00, 0x00, 0xfc, 0x18, 0x01]),
None,
sysloop.clone(),
)?,
)?));
\end{minted}
......@@ -197,17 +197,17 @@ A fő eseményfeldolgozó ciklus így néz ki:
\noindent\extlink{https://github.com/akosnad/rusty-esp-alarm/blob/1d3073a0cbd3b98af0f6a14bdf625732938f78e2/src/network.rs\#L136}{network.rs}
\begin{minted}[linenos,firstnumber=136]{rust}
fn mqtt_task(
status_tx: mpsc::Sender<StatusEvent>,
mqtt_client_config: MqttClientConfiguration<'_>,
status_tx: mpsc::Sender<StatusEvent>,
mqtt_client_config: MqttClientConfiguration<'_>,
) -> anyhow::Result<()> {
info!("Starting MQTT...");
let (client, mut connection) =
EspMqttClient::new_with_conn(MQTT_ENDPOINT, &mqtt_client_config)?;
let mut client = Some(client);
let mut ota = None;
while let Some(msg) = connection.next() {
match msg {
info!("Starting MQTT...");
let (client, mut connection) =
EspMqttClient::new_with_conn(MQTT_ENDPOINT, &mqtt_client_config)?;
let mut client = Some(client);
let mut ota = None;
while let Some(msg) = connection.next() {
match msg {
Err(e) => /* ... */,
Ok(msg) => {
// ...
......@@ -229,31 +229,31 @@ csak egy kivonatát mutatom itt be:
\noindent\extlink{https://github.com/akosnad/rusty-esp-alarm/blob/1d3073a0cbd3b98af0f6a14bdf625732938f78e2/src/network.rs\#L222}{network.rs}
\begin{minted}{rust}
fn handle_ota_message(msg: MessageImpl, ota: &mut Option<OtaUpdate>) -> anyhow::Result<()> {
let data = msg.data();
if let Some(mut in_progress_ota) = ota.take() {
match msg.details() {
Details::InitialChunk(_) => {
// hiba -- folyamatban lévő OTA közben érkezett egy újabb darabolt folyam első szelete
// ...
}
Details::SubsequentChunk(SubsequentChunkData {
current_data_offset,
total_data_size,
}) => {
// tovább írás a flash memóriára
// ...
}
Details::Complete => {
// ekkor a teljes új firmware ki van írva az inaktív partícióra,
// újraindítjuk a rendszert, erre átváltva
// ...
}
}
} else {
// OTA megkezdése
// a flash memórián megkeressük az inaktív partíciót, elkezdünk arra írni
// ...
}
let data = msg.data();
if let Some(mut in_progress_ota) = ota.take() {
match msg.details() {
Details::InitialChunk(_) => {
// hiba -- folyamatban lévő OTA közben érkezett egy újabb darabolt folyam első szelete
// ...
}
Details::SubsequentChunk(SubsequentChunkData {
current_data_offset,
total_data_size,
}) => {
// tovább írás a flash memóriára
// ...
}
Details::Complete => {
// ekkor a teljes új firmware ki van írva az inaktív partícióra,
// újraindítjuk a rendszert, erre átváltva
// ...
}
}
} else {
// OTA megkezdése
// a flash memórián megkeressük az inaktív partíciót, elkezdünk arra írni
// ...
}
}
\end{minted}
%TC: endignore
......@@ -276,27 +276,27 @@ egy új modulban hoztam létre az alábbi adatstruktúrákat:
\begin{minted}[linenos,firstnumber=8]{rust}
#[derive(Debug)]
pub enum AlarmEvent {
MotionDetected(HAEntity),
MotionCleared(HAEntity),
AlarmStateChanged((HAEntity, AlarmState)),
MotionDetected(HAEntity),
MotionCleared(HAEntity),
AlarmStateChanged((HAEntity, AlarmState)),
}
#[derive(Clone, PartialEq, Debug)]
pub enum AlarmState {
Disarmed,
Arming(Instant),
Armed(Instant),
Pending(Instant),
Triggered,
Disarmed,
Arming(Instant),
Armed(Instant),
Pending(Instant),
Triggered,
}
#[derive(Clone, PartialEq)]
pub enum AlarmCommand {
Arm,
ArmInstantly,
Disarm,
ManualTrigger,
Untrigger,
Arm,
ArmInstantly,
Disarm,
ManualTrigger,
Untrigger,
}
\end{minted}
%TC:endignore
......@@ -429,43 +429,43 @@ logikáját. Az inicializáció a következőképpen néz ki:
\noindent\extlink{https://github.com/akosnad/rusty-esp-alarm/blob/1d3073a0cbd3b98af0f6a14bdf625732938f78e2/src/scheduler.rs\#L113}{scheduler.rs}
\begin{minted}[linenos,firstnumber=113]{rust}
fn init_mqtt(
client: &mut EspMqttClient<'_, ConnState<MessageImpl, EspError>>,
entities: &[HAEntity],
client: &mut EspMqttClient<'_, ConnState<MessageImpl, EspError>>,
entities: &[HAEntity],
) -> anyhow::Result<()> {
const AVAILABILITY_TOPIC: &str = env!("ESP_AVAILABILITY_TOPIC");
const OTA_TOPIC: &str = env!("ESP_OTA_TOPIC");
// send entity config messages
for entity in entities.iter() {
let entity = HAEntity {
availability: Some(HADeviceAvailability {
payload_available: Some("online".to_string()),
payload_not_available: Some("offline".to_string()),
topic: AVAILABILITY_TOPIC.to_string(),
value_template: None,
}),
..entity.clone()
};
let topic = format!(
"{}/{}/{}/config",
"homeassistant", entity.variant, entity.unique_id
);
let entity_out: HAEntityOut = entity.into();
let payload = serde_json::to_string(&entity_out).unwrap();
client.publish(&topic, QoS::AtLeastOnce, true, payload.as_bytes())?;
if let Some(command_topic) = entity_out.command_topic {
client.subscribe(&command_topic, QoS::ExactlyOnce)?;
}
}
// birth message
client.publish(AVAILABILITY_TOPIC, QoS::AtLeastOnce, true, b"online")?;
// subscribe to ota
client.subscribe(OTA_TOPIC, QoS::ExactlyOnce)?;
Ok(())
const AVAILABILITY_TOPIC: &str = env!("ESP_AVAILABILITY_TOPIC");
const OTA_TOPIC: &str = env!("ESP_OTA_TOPIC");
// send entity config messages
for entity in entities.iter() {
let entity = HAEntity {
availability: Some(HADeviceAvailability {
payload_available: Some("online".to_string()),
payload_not_available: Some("offline".to_string()),
topic: AVAILABILITY_TOPIC.to_string(),
value_template: None,
}),
..entity.clone()
};
let topic = format!(
"{}/{}/{}/config",
"homeassistant", entity.variant, entity.unique_id
);
let entity_out: HAEntityOut = entity.into();
let payload = serde_json::to_string(&entity_out).unwrap();
client.publish(&topic, QoS::AtLeastOnce, true, payload.as_bytes())?;
if let Some(command_topic) = entity_out.command_topic {
client.subscribe(&command_topic, QoS::ExactlyOnce)?;
}
}
// birth message
client.publish(AVAILABILITY_TOPIC, QoS::AtLeastOnce, true, b"online")?;
// subscribe to ota
client.subscribe(OTA_TOPIC, QoS::ExactlyOnce)?;
Ok(())
}
\end{minted}
......@@ -487,43 +487,43 @@ oldottam meg:
\noindent\extlink{https://github.com/akosnad/rusty-esp-alarm/blob/1d3073a0cbd3b98af0f6a14bdf625732938f78e2/src/scheduler.rs\#L168}{scheduler.rs}
\begin{minted}[linenos,firstnumber=168]{rust}
fn send_alarm_state_change(
state: &AlarmState,
entity: &HAEntity,
client: &mut EspMqttClient<'_, ConnState<MessageImpl, EspError>>,
state: &AlarmState,
entity: &HAEntity,
client: &mut EspMqttClient<'_, ConnState<MessageImpl, EspError>>,
) -> anyhow::Result<()> {
let payload = match state {
AlarmState::Disarmed => "disarmed",
AlarmState::Arming(_) => "arming",
AlarmState::Armed(_) => "armed_away",
AlarmState::Pending(_) => "pending",
AlarmState::Triggered => "triggered",
};
client.publish(
&entity.state_topic,
QoS::AtLeastOnce,
true,
payload.as_bytes(),
)?;
Ok(())
let payload = match state {
AlarmState::Disarmed => "disarmed",
AlarmState::Arming(_) => "arming",
AlarmState::Armed(_) => "armed_away",
AlarmState::Pending(_) => "pending",
AlarmState::Triggered => "triggered",
};
client.publish(
&entity.state_topic,
QoS::AtLeastOnce,
true,
payload.as_bytes(),
)?;
Ok(())
}
fn handle_alarm_command(
payload: &str,
alarm_command_tx: &Sender<AlarmCommand>,
payload: &str,
alarm_command_tx: &Sender<AlarmCommand>,
) -> anyhow::Result<()> {
let command = match payload {
"ARM_AWAY" => AlarmCommand::Arm,
"ARM_CUSTOM_BYPASS" => AlarmCommand::ArmInstantly,
"DISARM" => AlarmCommand::Disarm,
"TRIGGER" => AlarmCommand::ManualTrigger,
"UNTRIGGER" => AlarmCommand::Untrigger,
_ => {
log::warn!("Unknown command: {}", payload);
return Ok(());
}
};
alarm_command_tx.send(command)?;
Ok(())
let command = match payload {
"ARM_AWAY" => AlarmCommand::Arm,
"ARM_CUSTOM_BYPASS" => AlarmCommand::ArmInstantly,
"DISARM" => AlarmCommand::Disarm,
"TRIGGER" => AlarmCommand::ManualTrigger,
"UNTRIGGER" => AlarmCommand::Untrigger,
_ => {
log::warn!("Unknown command: {}", payload);
return Ok(());
}
};
alarm_command_tx.send(command)?;
Ok(())
}
\end{minted}
......
......@@ -46,6 +46,22 @@ következtetést kell levonnom, hogy a jövőben több kutatást kell végeznem
az adott hardverről, és több alternatívát is érdemes összehasonlítani a
megválasztás előtt, hogy biztos lehessek annak megbízhatóságában.
Összeségében a bemutatott ESP32 alapú behatolásjelző rendszer nem csupán egy
sikeres megvalósítás, hanem egy olyan modern, rugalmas és fenntartható megoldás,
amely kiválóan ötvözi \aref{kereskedelmi}. fejezetben látott hagyományos és
DIY rendszerek előnyeit. A fejlesztés során választott technológiák – a Rust
nyelv memóriabiztonsági megfontolásai, az MQTT alapú kommunikáció, valamint a
Home Assistant okosotthon-integráció – biztosítják a rendszer megbízhatóságát,
bővíthetőségét és könnyű használhatóságát. Az elkészült rendszer nemcsak
stabil és hatékony működést garantál, hanem hosszú távon is megfelelő alapot
nyújt további fejlesztésekhez. Az egyszerű telepítés és automatizálási
lehetőségek révén a felhasználók kényelmesen és biztonságosan kezelhetik a
rendszert, miközben az alacsony fenntartási költségek biztosítják a gazdaságos
üzemeltetést. A projekt eredményei azt mutatják, hogy az innovatív technológiák
és a jól átgondolt tervezési döntések révén sikerült egy modern, életképes
megoldást létrehozni, amely teljes mértékben megfelel az eddig kitűzött
céloknak.
\section{Jövőbeli tervek}
\label{jovo}
......
......@@ -27,7 +27,7 @@ nélküli leütések számát jelenti.
{
\footnotesize
\verbatiminput{./build/charcount.tex}
\inputminted{ini}{./build/charcount.tex}
}
% \section{A dolgozat írásához használt eszközök és technológiák}
......
......@@ -718,3 +718,22 @@ urldate = {2025-04-22},
url = {https://news.ycombinator.com/item?id=8392945},
urldate = {2025-04-27},
}
@online{gh-lang-perf,
title = {Programming Language Comparison Cheat Sheet},
author = {quambene},
organization = {GitHub},
url = {https://github.com/quambene/pl-comparison},
urldate = {2025-05-04},
}
@article{hass-diagram,
author = {Farooq, Mansoor and Hassan, Mubashir},
year = {2021},
month = {01},
pages = {235},
title = {IoT smart homes security challenges and solution},
volume = {16},
journal = {International Journal of Security and Networks},
doi = {10.1504/IJSN.2021.119395},
}
Source diff could not be displayed: it is too large. Options to address this: view the blob.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="850px" height="1092px" viewBox="-0.5 -0.5 850 1092" content="&lt;mxfile host=&quot;app.diagrams.net&quot; agent=&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0&quot; version=&quot;26.2.14&quot;&gt;&#10; &lt;diagram name=&quot;Page-1&quot; id=&quot;e-GSYF6XiSxrgsoJKeIM&quot;&gt;&#10; &lt;mxGraphModel dx=&quot;895&quot; dy=&quot;1450&quot; grid=&quot;1&quot; gridSize=&quot;10&quot; guides=&quot;1&quot; tooltips=&quot;1&quot; connect=&quot;1&quot; arrows=&quot;1&quot; fold=&quot;1&quot; page=&quot;1&quot; pageScale=&quot;1&quot; pageWidth=&quot;850&quot; pageHeight=&quot;1100&quot; math=&quot;0&quot; shadow=&quot;0&quot;&gt;&#10; &lt;root&gt;&#10; &lt;mxCell id=&quot;0&quot; /&gt;&#10; &lt;mxCell id=&quot;1&quot; parent=&quot;0&quot; /&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-1&quot; value=&quot;Home Assistant&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&amp;quot;&amp;gt;core&amp;lt;/span&amp;gt;&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;verticalAlign=middle;horizontal=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;600&quot; y=&quot;240&quot; width=&quot;400&quot; height=&quot;80&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-3&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;startArrow=classic;startFill=1;endArrow=none;endFill=1;fillColor=none;curved=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;xgqc1izZYrOjt3BopqMO-2&quot; target=&quot;xgqc1izZYrOjt3BopqMO-1&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;910&quot; y=&quot;110&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;1030&quot; y=&quot;110&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-2&quot; value=&quot;Frontend&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;1055&quot; y=&quot;30&quot; width=&quot;120&quot; height=&quot;60&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-4&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;startArrow=none;startFill=0;endArrow=classic;endFill=1;fillColor=none;curved=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;xgqc1izZYrOjt3BopqMO-2&quot; target=&quot;xgqc1izZYrOjt3BopqMO-1&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;910&quot; y=&quot;130&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;1030&quot; y=&quot;130&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-5&quot; value=&quot;Interakció&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;1170&quot; y=&quot;160&quot; width=&quot;80&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-6&quot; value=&quot;Entitás állapotok&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;930&quot; y=&quot;160&quot; width=&quot;110&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-7&quot; value=&quot;Automatizmusok&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;460&quot; y=&quot;40&quot; width=&quot;150&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-8&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;startArrow=classic;startFill=1;endArrow=none;endFill=1;fillColor=none;exitX=0.75;exitY=1;exitDx=0;exitDy=0;curved=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;xgqc1izZYrOjt3BopqMO-7&quot; target=&quot;xgqc1izZYrOjt3BopqMO-1&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;170&quot; y=&quot;580&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;360&quot; y=&quot;579.31&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-9&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;startArrow=none;startFill=0;endArrow=classic;endFill=1;fillColor=none;curved=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;xgqc1izZYrOjt3BopqMO-7&quot; target=&quot;xgqc1izZYrOjt3BopqMO-1&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;240&quot; y=&quot;599.31&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;360&quot; y=&quot;599.31&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-10&quot; value=&quot;``Trigger&amp;#39;&amp;#39; események&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;600&quot; y=&quot;160&quot; width=&quot;140&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-11&quot; value=&quot;Interakció&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;400&quot; y=&quot;160&quot; width=&quot;80&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-12&quot; value=&quot;Entitáskezelő&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&amp;quot;&amp;gt;komponens&amp;lt;/span&amp;gt;&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;horizontal=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;690&quot; y=&quot;420&quot; width=&quot;220&quot; height=&quot;100&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-17&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;curved=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; target=&quot;xgqc1izZYrOjt3BopqMO-12&quot;&gt;&#10; &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;660&quot; y=&quot;320.0000000000002&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;650&quot; y=&quot;445&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;660&quot; y=&quot;445&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-19&quot; value=&quot;Interakció&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;560.02&quot; y=&quot;370&quot; width=&quot;80&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-20&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;curved=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;xgqc1izZYrOjt3BopqMO-12&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;950&quot; y=&quot;445&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;940&quot; y=&quot;320.0000000000002&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;940&quot; y=&quot;445&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-31&quot; value=&quot;Parancsok&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;560.02&quot; y=&quot;560&quot; width=&quot;80&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-34&quot; value=&quot;Platform&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;horizontal=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;690&quot; y=&quot;620&quot; width=&quot;220&quot; height=&quot;100&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-35&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;curved=0;exitX=0;exitY=0.75;exitDx=0;exitDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; target=&quot;xgqc1izZYrOjt3BopqMO-34&quot; source=&quot;xgqc1izZYrOjt3BopqMO-12&quot;&gt;&#10; &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;650.02&quot; y=&quot;495&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;650.02&quot; y=&quot;645&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;660.02&quot; y=&quot;495&quot; /&gt;&#10; &lt;mxPoint x=&quot;660.02&quot; y=&quot;645&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-36&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;curved=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;910.02&quot; y=&quot;492.5&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;940.02&quot; y=&quot;642.5&quot; /&gt;&#10; &lt;mxPoint x=&quot;940.02&quot; y=&quot;492.5&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;mxPoint x=&quot;910.02&quot; y=&quot;642.5&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-37&quot; value=&quot;Eszközkezelő szoftver&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;horizontal=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;690&quot; y=&quot;820&quot; width=&quot;220&quot; height=&quot;100&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-39&quot; value=&quot;Parancsok&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;560.02&quot; y=&quot;755&quot; width=&quot;80&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-40&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;curved=0;exitX=0;exitY=0.75;exitDx=0;exitDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;690&quot; y=&quot;690&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;690&quot; y=&quot;840&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;660&quot; y=&quot;690&quot; /&gt;&#10; &lt;mxPoint x=&quot;660&quot; y=&quot;840&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-41&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;curved=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;910&quot; y=&quot;687.5&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;940&quot; y=&quot;837.5&quot; /&gt;&#10; &lt;mxPoint x=&quot;940&quot; y=&quot;687.5&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;mxPoint x=&quot;910&quot; y=&quot;837.5&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-42&quot; value=&quot;Fizikai eszköz&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;horizontal=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;690&quot; y=&quot;1020&quot; width=&quot;220&quot; height=&quot;100&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-43&quot; value=&quot;Állapotok, e&amp;lt;span style=&amp;quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&amp;quot;&amp;gt;semények&amp;lt;/span&amp;gt;&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;970&quot; y=&quot;965&quot; width=&quot;140&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-44&quot; value=&quot;Parancsok&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;560.02&quot; y=&quot;965&quot; width=&quot;80&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-45&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;curved=0;exitX=0;exitY=0.75;exitDx=0;exitDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;690&quot; y=&quot;900&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;690&quot; y=&quot;1050&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;660&quot; y=&quot;900&quot; /&gt;&#10; &lt;mxPoint x=&quot;660&quot; y=&quot;1050&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-46&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;curved=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;910&quot; y=&quot;897.5&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;940&quot; y=&quot;1047.5&quot; /&gt;&#10; &lt;mxPoint x=&quot;940&quot; y=&quot;897.5&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;mxPoint x=&quot;910&quot; y=&quot;1047.5&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-47&quot; value=&quot;Állapotok, e&amp;lt;span style=&amp;quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&amp;quot;&amp;gt;semények&amp;lt;/span&amp;gt;&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;970&quot; y=&quot;755&quot; width=&quot;140&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-48&quot; value=&quot;Állapotok, e&amp;lt;span style=&amp;quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&amp;quot;&amp;gt;semények&amp;lt;/span&amp;gt;&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;970&quot; y=&quot;560&quot; width=&quot;140&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;xgqc1izZYrOjt3BopqMO-49&quot; value=&quot;Állapotok, e&amp;lt;span style=&amp;quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&amp;quot;&amp;gt;semények&amp;lt;/span&amp;gt;&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;970&quot; y=&quot;370&quot; width=&quot;140&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;/root&gt;&#10; &lt;/mxGraphModel&gt;&#10; &lt;/diagram&gt;&#10;&lt;/mxfile&gt;&#10;"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="xgqc1izZYrOjt3BopqMO-1"><g><rect x="200" y="210" width="400" height="80" rx="12" ry="12" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 398px; height: 1px; padding-top: 250px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Home Assistant <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">core</span></div></div></div></foreignObject><text x="400" y="254" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Home Assistant core</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-3"><g><path d="M 685 66.37 L 685 220 Q 685 230 675 230 L 600 230" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 685 61.12 L 688.5 68.12 L 685 66.37 L 681.5 68.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-2"><g><rect x="655" y="0" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 30px; margin-left: 656px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Frontend</div></div></div></foreignObject><text x="715" y="34" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Frontend</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-4"><g><path d="M 745 60 L 745 260 Q 745 270 735 270 L 606.37 270" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 601.12 270 L 608.12 266.5 L 606.37 270 L 608.12 273.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-5"><g><rect x="770" y="130" width="80" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 145px; margin-left: 810px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Interakció</div></div></div></foreignObject><text x="810" y="149" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Interakció</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-6"><g><rect x="530" y="130" width="110" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 145px; margin-left: 585px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Entitás állapotok</div></div></div></foreignObject><text x="585" y="149" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Entitás állapotok</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-7"><g><rect x="60" y="10" width="150" height="90" rx="13.5" ry="13.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 55px; margin-left: 61px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Automatizmusok</div></div></div></foreignObject><text x="135" y="59" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Automatizmusok</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-8"><g><path d="M 172.5 106.37 L 172.5 220 Q 172.5 230 182.5 230 L 200 230" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 172.5 101.12 L 176 108.12 L 172.5 106.37 L 169 108.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-9"><g><path d="M 97.5 100 L 97.5 260 Q 97.5 270 107.5 270 L 193.63 270" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 198.88 270 L 191.88 273.5 L 193.63 270 L 191.88 266.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-10"><g><rect x="200" y="130" width="140" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 145px; margin-left: 270px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">``Trigger'' események</div></div></div></foreignObject><text x="270" y="149" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">``Trigger'' események</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-11"><g><rect x="0" y="130" width="80" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 145px; margin-left: 40px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Interakció</div></div></div></foreignObject><text x="40" y="149" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Interakció</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-12"><g><rect x="290" y="390" width="220" height="100" rx="15" ry="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 440px; margin-left: 291px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Entitáskezelő <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">komponens</span></div></div></div></foreignObject><text x="400" y="444" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Entitáskezelő komponens</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-17"><g><path d="M 260 290 L 260 405 Q 260 415 270 415 L 283.63 415" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 288.88 415 L 281.88 418.5 L 283.63 415 L 281.88 411.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-19"><g><rect x="160.02" y="340" width="80" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 355px; margin-left: 200px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Interakció</div></div></div></foreignObject><text x="200" y="359" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Interakció</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-20"><g><path d="M 510 415 L 530 415 Q 540 415 540 405 L 540 296.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 540 291.12 L 543.5 298.12 L 540 296.37 L 536.5 298.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-31"><g><rect x="160.02" y="530" width="80" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 545px; margin-left: 200px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Parancsok</div></div></div></foreignObject><text x="200" y="549" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Parancsok</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-34"><g><rect x="290" y="590" width="220" height="100" rx="15" ry="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 640px; margin-left: 291px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Platform</div></div></div></foreignObject><text x="400" y="644" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Platform</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-35"><g><path d="M 290 465 L 270.02 465 Q 260.02 465 260.02 475 L 260.02 605 Q 260.02 615 270.02 615 L 283.63 615" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 288.88 615 L 281.88 618.5 L 283.63 615 L 281.88 611.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-36"><g><path d="M 510.02 612.5 L 530 612.5 Q 540 612.5 540 602.5 L 540 472.5 Q 540 462.5 530 462.5 L 516.39 462.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 511.14 462.5 L 518.14 459 L 516.39 462.5 L 518.14 466 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-37"><g><rect x="290" y="790" width="220" height="100" rx="15" ry="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 840px; margin-left: 291px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Eszközkezelő szoftver</div></div></div></foreignObject><text x="400" y="844" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Eszközkezelő szoftver</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-39"><g><rect x="160.02" y="725" width="80" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 740px; margin-left: 200px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Parancsok</div></div></div></foreignObject><text x="200" y="744" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Parancsok</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-40"><g><path d="M 290 660 L 270 660 Q 260 660 260 670 L 260 800 Q 260 810 270 810 L 283.63 810" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 288.88 810 L 281.88 813.5 L 283.63 810 L 281.88 806.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-41"><g><path d="M 510 807.5 L 530 807.5 Q 540 807.5 540 797.5 L 540 667.5 Q 540 657.5 530 657.5 L 516.37 657.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 511.12 657.5 L 518.12 654 L 516.37 657.5 L 518.12 661 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-42"><g><rect x="290" y="990" width="220" height="100" rx="15" ry="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 1040px; margin-left: 291px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Fizikai eszköz</div></div></div></foreignObject><text x="400" y="1044" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Fizikai eszköz</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-43"><g><rect x="570" y="935" width="140" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 950px; margin-left: 640px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Állapotok, e<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">semények</span></div></div></div></foreignObject><text x="640" y="954" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Állapotok, események</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-44"><g><rect x="160.02" y="935" width="80" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 950px; margin-left: 200px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Parancsok</div></div></div></foreignObject><text x="200" y="954" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Parancsok</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-45"><g><path d="M 290 870 L 270 870 Q 260 870 260 880 L 260 1010 Q 260 1020 270 1020 L 283.63 1020" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 288.88 1020 L 281.88 1023.5 L 283.63 1020 L 281.88 1016.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-46"><g><path d="M 510 1017.5 L 530 1017.5 Q 540 1017.5 540 1007.5 L 540 877.5 Q 540 867.5 530 867.5 L 516.37 867.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 511.12 867.5 L 518.12 864 L 516.37 867.5 L 518.12 871 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-47"><g><rect x="570" y="725" width="140" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 740px; margin-left: 640px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Állapotok, e<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">semények</span></div></div></div></foreignObject><text x="640" y="744" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Állapotok, események</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-48"><g><rect x="570" y="530" width="140" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 545px; margin-left: 640px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Állapotok, e<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">semények</span></div></div></div></foreignObject><text x="640" y="549" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Állapotok, események</text></switch></g></g></g><g data-cell-id="xgqc1izZYrOjt3BopqMO-49"><g><rect x="570" y="340" width="140" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 355px; margin-left: 640px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">Állapotok, e<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">semények</span></div></div></div></foreignObject><text x="640" y="359" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Állapotok, események</text></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0" version="26.2.14">
<diagram name="Page-1" id="UGyABVkxVIFzaqrF2EGz">
<mxGraphModel dx="597" dy="967" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="DZekISrqogctWNj2kWzD-1" value="MQTT\\&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;kliens&lt;/span&gt;&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="150" y="400" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="DZekISrqogctWNj2kWzD-2" value="MQTT\\&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;kliens&lt;/span&gt;&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="120" y="530" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="DZekISrqogctWNj2kWzD-3" value="MQTT\\&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;kliens&lt;/span&gt;&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="150" y="660" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="DZekISrqogctWNj2kWzD-4" value="MQTT\\&lt;div&gt;broker&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="310" y="560" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="DZekISrqogctWNj2kWzD-5" value="MQTT\\&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;kliens&lt;/span&gt;&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="510" y="400" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="DZekISrqogctWNj2kWzD-6" value="MQTT\\&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;kliens&lt;/span&gt;&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="530" y="530" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="DZekISrqogctWNj2kWzD-7" value="MQTT\\&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;kliens&lt;/span&gt;&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="510" y="660" width="80" height="80" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
<?xml version="1.0" encoding="UTF-8"?>
<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="492px" height="351px" viewBox="-0.5 -0.5 492 351" content="&lt;mxfile host=&quot;app.diagrams.net&quot; agent=&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0&quot; version=&quot;26.2.14&quot;&gt;&#10; &lt;diagram name=&quot;Page-1&quot; id=&quot;u-_sONg8PaacN-QFZamk&quot;&gt;&#10; &lt;mxGraphModel dx=&quot;494&quot; dy=&quot;800&quot; grid=&quot;1&quot; gridSize=&quot;10&quot; guides=&quot;1&quot; tooltips=&quot;1&quot; connect=&quot;1&quot; arrows=&quot;1&quot; fold=&quot;1&quot; page=&quot;1&quot; pageScale=&quot;1&quot; pageWidth=&quot;850&quot; pageHeight=&quot;1100&quot; math=&quot;0&quot; shadow=&quot;0&quot;&gt;&#10; &lt;root&gt;&#10; &lt;mxCell id=&quot;0&quot; /&gt;&#10; &lt;mxCell id=&quot;1&quot; parent=&quot;0&quot; /&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--1&quot; value=&quot;kliens&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;160&quot; y=&quot;410&quot; width=&quot;90&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--2&quot; value=&quot;kliens&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;130&quot; y=&quot;540&quot; width=&quot;90&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--3&quot; value=&quot;kliens&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;160&quot; y=&quot;670&quot; width=&quot;90&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--4&quot; value=&quot;broker&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;320&quot; y=&quot;550&quot; width=&quot;120&quot; height=&quot;70&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--5&quot; value=&quot;kliens&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;510&quot; y=&quot;410&quot; width=&quot;90&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--6&quot; value=&quot;kliens&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;530&quot; y=&quot;540&quot; width=&quot;90&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--7&quot; value=&quot;kliens&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;510&quot; y=&quot;670&quot; width=&quot;90&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--9&quot; value=&quot;&quot; style=&quot;curved=1;endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;nID7ZsawUktWha8Jv44--1&quot; target=&quot;nID7ZsawUktWha8Jv44--4&quot;&gt;&#10; &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;320&quot; y=&quot;510&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;400&quot; y=&quot;490&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;260&quot; y=&quot;520&quot; /&gt;&#10; &lt;mxPoint x=&quot;380&quot; y=&quot;450&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--10&quot; value=&quot;2. publish&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;270&quot; y=&quot;450&quot; width=&quot;70&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--11&quot; value=&quot;&quot; style=&quot;curved=1;endArrow=classic;html=1;rounded=0;exitX=0.027;exitY=0.697;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;nID7ZsawUktWha8Jv44--7&quot; target=&quot;nID7ZsawUktWha8Jv44--4&quot;&gt;&#10; &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;350&quot; y=&quot;750&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;400&quot; y=&quot;700&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;410&quot; y=&quot;740&quot; /&gt;&#10; &lt;mxPoint x=&quot;310&quot; y=&quot;710&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--12&quot; value=&quot;1. subscribe&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;320&quot; y=&quot;730&quot; width=&quot;90&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--13&quot; value=&quot;&quot; style=&quot;curved=1;endArrow=classic;html=1;rounded=0;entryX=0.327;entryY=0.037;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.75;exitY=1;exitDx=0;exitDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;nID7ZsawUktWha8Jv44--4&quot; target=&quot;nID7ZsawUktWha8Jv44--7&quot;&gt;&#10; &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10; &lt;mxPoint x=&quot;410&quot; y=&quot;700&quot; as=&quot;sourcePoint&quot; /&gt;&#10; &lt;mxPoint x=&quot;460&quot; y=&quot;650&quot; as=&quot;targetPoint&quot; /&gt;&#10; &lt;Array as=&quot;points&quot;&gt;&#10; &lt;mxPoint x=&quot;430&quot; y=&quot;680&quot; /&gt;&#10; &lt;mxPoint x=&quot;510&quot; y=&quot;630&quot; /&gt;&#10; &lt;/Array&gt;&#10; &lt;/mxGeometry&gt;&#10; &lt;/mxCell&gt;&#10; &lt;mxCell id=&quot;nID7ZsawUktWha8Jv44--14&quot; value=&quot;3. üzenet fogadása&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10; &lt;mxGeometry x=&quot;375&quot; y=&quot;670&quot; width=&quot;130&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10; &lt;/mxCell&gt;&#10; &lt;/root&gt;&#10; &lt;/mxGraphModel&gt;&#10; &lt;/diagram&gt;&#10;&lt;/mxfile&gt;&#10;"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="nID7ZsawUktWha8Jv44--1"><g><ellipse cx="75" cy="45" rx="45" ry="45" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 45px; margin-left: 31px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">kliens</div></div></div></foreignObject><text x="75" y="49" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">kliens</text></switch></g></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--2"><g><ellipse cx="45" cy="175" rx="45" ry="45" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 175px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">kliens</div></div></div></foreignObject><text x="45" y="179" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">kliens</text></switch></g></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--3"><g><ellipse cx="75" cy="305" rx="45" ry="45" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 305px; margin-left: 31px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">kliens</div></div></div></foreignObject><text x="75" y="309" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">kliens</text></switch></g></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--4"><g><rect x="190" y="140" width="120" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 175px; margin-left: 191px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">broker</div></div></div></foreignObject><text x="250" y="179" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">broker</text></switch></g></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--5"><g><ellipse cx="425" cy="45" rx="45" ry="45" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 45px; margin-left: 381px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">kliens</div></div></div></foreignObject><text x="425" y="49" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">kliens</text></switch></g></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--6"><g><ellipse cx="445" cy="175" rx="45" ry="45" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 175px; margin-left: 401px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">kliens</div></div></div></foreignObject><text x="445" y="179" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">kliens</text></switch></g></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--7"><g><ellipse cx="425" cy="305" rx="45" ry="45" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 305px; margin-left: 381px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">kliens</div></div></div></foreignObject><text x="425" y="309" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">kliens</text></switch></g></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--9"><g><path d="M 106.82 76.82 Q 130 110 190 75 Q 250 40 250 133.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 250 138.88 L 246.5 131.88 L 250 133.63 L 253.5 131.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--10"><g><rect x="140" y="40" width="70" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 55px; margin-left: 175px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">2. publish</div></div></div></foreignObject><text x="175" y="59" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">2. publish</text></switch></g></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--11"><g><path d="M 382.43 322.73 Q 280 330 230 315 Q 180 300 217.41 215.82" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 219.55 211.02 L 219.9 218.84 L 217.41 215.82 L 213.5 216 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--12"><g><rect x="190" y="320" width="90" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 335px; margin-left: 235px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">1. subscribe</div></div></div></foreignObject><text x="235" y="339" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">1. subscribe</text></switch></g></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--13"><g><path d="M 280 210 Q 300 270 340 245 Q 380 220 405.85 258.06" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 408.8 262.41 L 401.97 258.58 L 405.85 258.06 L 407.76 254.65 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="nID7ZsawUktWha8Jv44--14"><g><rect x="245" y="260" width="130" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 275px; margin-left: 310px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; ">3. üzenet fogadása</div></div></div></foreignObject><text x="310" y="279" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">3. üzenet fogadása</text></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file
......@@ -80,17 +80,11 @@
% Hasznos csomagok
% -------------------------------------------------------
% ékezetes betűk kezelése
% \usepackage[utf8]{inputenc}
% ékezetes betűknél is legyen automatikus elválasztás
% \usepackage[T1]{fontenc}
\usepackage{fontspec}
\setmonofont{Recursive Mono Linear Static}
% nyelvi csomag
\def\magyarOptions{defaults=hu-min}
\usepackage[english, magyar]{babel}
\PassOptionsToPackage{english,magyar}{babel}
\usepackage[font=cm,fontspec,inputenc=utf8]{uni8}
\setmonofont{Recursive Mono Linear Static}
% képletekhez kell
\usepackage{mathtools}
......@@ -113,6 +107,12 @@
% Hyperlinks - URL-ek a szövegben
\usepackage{url}
% syntax highlighthoz
\usepackage{minted}
\setminted{style=colorful,fontsize=\footnotesize,breaklines=true,tabsize=2}
%TC:envir minted [] other
% Hosszabb idézetek
\usepackage{csquotes}
......@@ -140,10 +140,10 @@
\usepackage{lipsum}
% Csak hogy ne sírjon amiatt, hogy a BibLatex 3.12-es verziója rengeteg változtatást tartalmaz az előző verzióhoz képest
\BiblatexHungarianWarningOff
% \BiblatexHungarianWarningOff
% Ez meg egy másik felesleges warning-ot némít el (https://tex.stackexchange.com/a/451193)
\usepackage{silence}
\WarningFilter{biblatex}{File 'english-ieee.lbx'}
% \usepackage{silence}
% \WarningFilter{biblatex}{File 'english-ieee.lbx'}
% vektorgrafikus ábrák beszúrásához
\usepackage{tikz}
......@@ -183,6 +183,13 @@
\newcommand{\extlink}[2]{\href{#1}{\texttt{\small #2}\ \ExternalLinkIcon}}
% -------------------------------------------------------
% Ezeket írd át...
\def\tipus{\textbf{Szakdolgozat}} % --> ha MSc-s vagy, írd át "DIPLOMAMUNKA"-ra!
\def\nev{Nádudvari Ákos}
\def\kepzes{Mérnökinformatikus BSc}
\def\cim{\textsl{ESP32 alapú biztonsági rendszer tervezése és megvalósítása Rust nyelv használatával, okosotthon-integrációval}}
\def\temavezetok{Témavezető:\\Tihanyi Attila Kálmán}
% Címoldal + üres lap utána
% -------------------------------------------------------
......@@ -241,15 +248,8 @@
% -------------------------------------------------------
% karakterszám exportálása
\usepackage{moreverb}
\immediate\write18{texcount -char -tex -merge -sum ./\jobname.tex > ./build/charcount.tex}
% syntax highlighthoz
\usepackage{minted}
\setminted{style=colorful,fontsize=\footnotesize,breaklines=true}
%TC:envir minted [] other
% ------------- Dokumentum legenerálása -----------------
\begin{document}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment