Hallo DOIF Fans,
ich komme hier immer wieder an meine Grenzen und bekomme es nicht gebacken meine komponenten geschickt zu verschalten um unsere Alarmanlage zu realisieren. Ich hoffe auf Hilfe von euch..
Als erstes ein kurzer überblick über vorhandene Devices und verschaltungen...
Es sind drei iButton Reader ( DG9092L2-M20-ST-MG2 ) verbaut, zwei am Gartentor und einer an der Haustür.
Die beiden Leser am Gartentor ( coming & leaving ) arbeiten auch Stand-Alone, öffnen das Gartentor und melden die gelesene ID und welcher Leser ( coming oder leavinh ) betätigt wurde via UDP message an FHEM. ( ESPGardenDoor )
Der Leser an der Haustür sendet die gelesene ID ebenfalls via UDP an FHEM ( ESPMainDoor )
Im Haus arbeitet eine Wago SPS ( 750-880 ) diese gibt ihr Prozessabbild via ModbusTCP an FHEM weiter.
Im Haus ist ein Taster vorhanden um die Alarmanlage "unscharf" zu schalten. Türöffner werden ebenfalls über die Wago geschaltet.
In der Haustür gibt es zwei Sensoren ( Tür offen & geschlossen ) und ( Tür abgeschlossen ) als Aktor ist ein Türöffner verbaut.
Der Sensor offen & geschlossen verfügt über eine sichtbare LED - wenn die Tür geschlossen ist leuchtet diese.
In der Wago SPS ist dieser Sensor mit dem Tür abgeschlossen Sensor verknüpft - wenn abgeschlossen blinkt der Sensor im 2sekunden/100ms takt das soll als Signal dienen. Wenn es blinkt ist Alarmanlage scharf - leuchtet dauerhaft = unscharf
Ich wünsche mir vier Zustände für die Alarmanlage - armHome|confirm|armAway|disarm
Zur Zeit kommt hier das HomeMode Modul zum Einsatz, das kann aber auch weg wenn die funktionen hier abgebildet und evtl. via uiTable visualisiert werden.
armHome:
Wenn wir Abends die Haustür abgeschlossen haben soll in den Zustand armHome gewechselt werden - als Trigger kommt hier der Sensor MainDoorLocked in frage. armHome überwacht nicht alle Fenster und Türen sodass wir in der Lage sind z.b. die Terrassentür oder das Toilettenfenster zu nutzen ohne einen Alarm auszulösen. Von armHome kommen wir zurück in disarm wenn wir den Taster betätigen, oder aussen eine gültige ID gelesen wird.
confirm:
Wenn die Haustür weder abgeschlossen noch geschlossen ist und der Reader an der Haustür betätigt wird wünsche ich mir das die grüne LED im Reader leuchtet wenn alle Fenster geschlossen sind. Wenn z.b. Fenster im OG geöffnet sind soll die grüne LED blinken. Die rote soll angehen wenn noch Fenster im EG geöffnet sind - blinken soll sie wenn es als kritisch angesehen werden kann ( Terassentür nicht verriegelt )
Wenn der Sensor MainDoorLocked betätigt wird soll in den Zustand armAway gewechselt werden.
armAway:
Der Zustand der Fenster beim verlassen des Hauses soll gespeichert werden. Veränderungen sollen zum auslösen des Alarms führen.
Wenn armAway gesetzt ist - und jemand kommt am GartenTor Leser "coming" an soll an der Haustür die rote LED leuchten um zu Signalisieren das die Alarmanlage scharf ist...
disarm:
Die Alarmanlage wartet eigentlich nur auf aktivierung durch abschliessen oder das Lesen eines Schlüssels - wenn der Schlüssel bei geschlossener Tür gelesen wird soll der Türöffner betätigt werden.
Zur Zeit versuche ich den ganzen kram innerhalb von zwei DOIFs zu verschalten - es gibt aber immer wieder probleme und fehlfunktionen.
Ich hoffe mit eurer Hilfe auf DOIF Perl umbauen zu können, alleine bekomme ich das sicher nicht hin - es geht schon damit los erstmal einen Anfang zu finden.
Du kannst im Perlmodus damit anfangen für jeden Zustand einen eigenen Block zu programmieren, der in Abhängigkeit der Bedingungen den Zustand z. B. in einem Reading mit set_Reading setzt.
Wenn die einzelnen Zustände sich per Definition gegenseitig ausschließen, um so besser, sonst kannst du den gesetzten Zustand im Reading mit abfragen.
Die Visualisierung kannst du über verschiedene Elemente: Anzeige von Readings (Zustände), Zeiten mit Eingabe, Auswahlkästchen oder sonstige Bedienelemente über uiTable realisieren.
Ja, ich hatte auch gedacht ich fange einfach mal an - die Liste der "erlaubten" IDs hätte ich zuerst Namen zugeordnet,
ich scheitere aber offenbar von vorne herein an der Syntax...
entryControl DOIF: error in defs block: syntax error at (eval 162154) line 3, near "ESPMainDoor:"
subs {
sub ReaderData {
if ([ESPMainDoor:ID] eq "019XXXXX0000e2")
fhem_set (AlarmModeHistory add Michael am Leser);
}}
Internals:
DEF ESP MainDoor
FUUID 6X-20064d424f907c7b
ID ESP_MainDoor
IODev UDPServer
LASTInputDev UDPServer
MSGCNT 835
NAME ESPMainDoor
NR 635
STATE alive
TYPE KeyValueProtocol
UDPServer_IP 192.168.1.194
UDPServer_MSGCNT 837
UDPServer_TIME 2022-11-04 20:12:41
eventCount 835
model ESP
READINGS:
2022-11-04 20:12:41 ID X
2022-11-03 15:47:01 IODev UDPServer
2022-11-03 10:51:55 T X
2022-11-04 20:12:41 direction X
2022-11-04 20:12:41 state alive
Attributes:
DbLogExclude .*
Mapping state=state,P=ID,D=direction
devStateIcon dead:10px-kreis-rot alive:10px-kreis-gruen recievedUDP:10px-kreis-gruen Initialized:10px-kreis-gelb
room 00 - Haus -> 13 - Tür & Tore,90 - System -> 96 - Server -> UDPServer
Der subs-Block ist nur dazu da Funktionen zu definieren, die Blöcke können mit eigenen Namen definiert werden:
DOIF
DOIF armHome {
if (...) {
set_Reading("zustand","armHome");
}
}
confirm {
if (....) {
set_Reading("zustand","confirm");
}
}
armAway {
if (....) {
set_Reading("zustand","armAway");
}
}
Ok - ich versuche mal anzufangen, habe aber direkt schon einen Knoten im Kopf weil ich denke das es ja eine art state machine werden muss.
armHome kann erreicht werden wenn die Haustür geschlossen ist und in verriegelt gewechselt wird.
confirm aber z.b. wenn während Haustür offen ist Leserdaten kommen. Die Leserdaten müssen wiederum quitiert werden um rot oder grün zu schalten.
armaway wird nur gesetzt wenn vorher confirm als Zustand war. Hier kommt noch eine unüberlegte Situation hinzu - was wenn ich mich nach rotem hinweis entschliese noch reinzugehen und das Fenster zu schliessen..?
Es ergibt sich eine art Ereignisfolge - die Kunst ist es wohl dafür zu sorgen das es nicht aus dem "tritt" gerät ;)
Die Leserdaten einem Bewohner zuzuordnen hätte ich jetzt als sub funktion gesehen, oder? AlarmModeHistory ist übrigens ein Device readingsHistory und setzt sowas wie Toast messages in ein Fenster zum nachlesen, nutze ich als flüchtiges Log gerne.
Zitat von: der-Lolo am 04 November 2022, 21:02:49
Ok - ich versuche mal anzufangen, habe aber direkt schon einen Knoten im Kopf weil ich denke das es ja eine art state machine werden muss.
armHome kann erreicht werden wenn die Haustür geschlossen ist und in verriegelt gewechselt wird.
confirm aber z.b. wenn während Haustür offen ist Leserdaten kommen. Die Leserdaten müssen wiederum quitiert werden um rot oder grün zu schalten.
armaway wird nur gesetzt wenn vorher confirm als Zustand war. Hier kommt noch eine unüberlegte Situation hinzu - was wenn ich mich nach rotem hinweis entschliese noch reinzugehen und das Fenster zu schliessen..?
Es ergibt sich eine art Ereignisfolge - die Kunst ist es wohl dafür zu sorgen das es nicht aus dem "tritt" gerät ;)
Deswegen kannst du ja in den if-Abfragen, wie ich schon geschrieben habe, den aktuellen Zustand ebenfalls abfragen:
if (get_Reading("zustand") eq "confirm" and ....) {...
Ok, ich hab jetzt sowas:
Internals:
CFGFN
DEF armHome {
if (get_Reading("Home:alarmState") eq "disarm" and [MainDoorLocked] eq "on") {
fhem_set ("Home modeAlarm armHome"); #Home = FHEM Device vom Typ homemode
fhem_set ("AlarmModeHistory add Haustür abgeschlossen - armHome gesetzt"); #Toastmessage
fhem_set ("AlarmEnabler on"); #für Wago umschaltung auf Blinklicht am Sensor
}
}
confirm {
if ([ESPMainDoor:ID] eq "neuesReading prüfen und zuordnen Ergebnis einer sub z.b. validKey?" and [MainDoorClosed] eq "off") {
fhem_set ("Home modeAlarm confirm");
fhem_set ("AlarmModeHistory add scharf schalten Anfrage gestellt - confirm gesetzt");
}
}
armAway {
if (get_Reading("Home:alarmState") eq "confirmed" and [MainDoorLocked] eq "on") {
fhem_set ("Home modeAlarm armAway");
fhem_set ("AlarmModeHistory add Haustür abgeschlossen, niemand mehr zuhause - armaway gesetzt");
fhem_set ("AlarmEnabler on");
}
}
disarm {
if (get_Reading("Home:alarmState") eq "armHome" and [MainDoorLocked] eq "on" and [AlarmDisabler] eq "on") {
fhem_set ("Home modeAlarm disarm");
fhem_set ("AlarmModeHistory add durch Taster unscharf geschaltet - disarm gesetzt");
fhem_set ("AlarmEnabler off"); #Wago blinklicht aus
}
}
FUUID 636529b3-f33f-4532-aa56-33cafb791db8d33d
MODEL Perl
NAME entryControl
NOTIFYDEV MainDoorLocked,ESPMainDoor,AlarmDisabler,MainDoorClosed,global
NR 11887
NTFY_ORDER 50-entryControl
STATE initialized
TYPE DOIF
VERSION 26444 2022-09-25 16:29:19
eventCount 27
Helper:
DBLOG:
cmd:
logdb:
TIME 1667574195.06163
VALUE 0
mode:
logdb:
TIME 1667596647.71413
VALUE enabled
state:
logdb:
TIME 1667574195.06163
VALUE initialized
READINGS:
2022-11-04 22:17:27 mode enabled
2022-11-04 22:17:27 state initialized
Regex:
accu:
collect:
cond:
AlarmDisabler:
3:
&STATE ^AlarmDisabler$
ESPMainDoor:
1:
ID ^ESPMainDoor$:^ID:
MainDoorClosed:
1:
&STATE ^MainDoorClosed$
MainDoorLocked:
0:
&STATE ^MainDoorLocked$
2:
&STATE ^MainDoorLocked$
3:
&STATE ^MainDoorLocked$
condition:
0
if (get_Reading("Home:alarmState") eq "disarm" and ::InternalDoIf($hash,'MainDoorLocked','STATE') eq "on") {
fhem_set ("Home modeAlarm armHome"); #Home = FHEM Device vom Typ homemode
fhem_set ("AlarmModeHistory add Haustür abgeschlossen - armHome gesetzt"); #Toastmessage
fhem_set ("AlarmEnabler on"); #für Wago umschaltung auf Blinklicht am Sensor
}
1
if (::ReadingValDoIf($hash,'ESPMainDoor','ID') eq "neuesReading prüfen und zuordnen Ergebnis einer sub z.b. validKey?" and ::InternalDoIf($hash,'MainDoorClosed','STATE') eq "off") {
fhem_set ("Home modeAlarm confirm");
fhem_set ("AlarmModeHistory add scharf schalten Anfrage gestellt - confirm gesetzt");
}
2
if (get_Reading("Home:alarmState") eq "confirmed" and ::InternalDoIf($hash,'MainDoorLocked','STATE') eq "on") {
fhem_set ("Home modeAlarm armAway");
fhem_set ("AlarmModeHistory add Haustür abgeschlossen, niemand mehr zuhause - armaway gesetzt");
fhem_set ("AlarmEnabler on");
}
3
if (get_Reading("Home:alarmState") eq "armHome" and ::InternalDoIf($hash,'MainDoorLocked','STATE') eq "on" and ::InternalDoIf($hash,'AlarmDisabler','STATE') eq "on") {
fhem_set ("Home modeAlarm disarm");
fhem_set ("AlarmModeHistory add durch Taster unscharf geschaltet - disarm gesetzt");
fhem_set ("AlarmEnabler off"); #Wago blinklicht aus
}
helper:
NOTIFYDEV MainDoorLocked,ESPMainDoor,AlarmDisabler,MainDoorClosed,global
globalinit 1
last_timer 0
sleeptimer -1
internals:
all MainDoorLocked:STATE MainDoorClosed:STATE AlarmDisabler:STATE
perlblock:
0 armHome
1 confirm
2 armAway
3 disarm
powerMap:
readings:
all ESPMainDoor:ID
readingsDesc:
energy:
rtype whr
power:
rtype w
uiState:
uiTable:
Attributes:
das Reading ID müsste ich noch vergleichen und einem Bewohner zuordnen es sind derzeit 5 verschiedene schlüssel im umlauf es könnte auch gegen eine Liste geprüft werden "wenn neues Reading vom ESPMainDoor:ID in Liste vorhanden = validKey = true. Deswegen auch mein anfang mit der sub...
Im Zustand confirmed sollen ja auch die Fenster integriert werden, da gibt es also ein paar abzweigungen zu gehen.
Also irgendwie funktioniert so jetzt erst mal gar nichts - versteh ich nicht...
Ich habe ein zweites DOIF erstellt um die gelesene ID zuzuordnen und zu prüfen. Via cmdstate schreibe "true" wenn der Schlüssel bekannt ist "false" im Doelse
Ich hätte nun erwartet das der Block "confirm" ausgelöst wird wenn das DOIF validKey im state auf true geht - es passiert aber nichts.
Das hier kann nicht funktionieren:
get_Reading("Home:alarmState")
get_Reading ist nur für die Reading des eigenen DOIFs gedacht:
Du meist wahrscheinlich [?Home:alarmState] oder ReadingVal("Home","alarmState","")
Super, Danke Dir -
jetzt komm ich der Sache schon näher...
ein list:
Internals:
CFGFN
DEF armHome {
if ([?Home:alarmState] eq "disarm" and [MainDoorLocked] eq "on") {
fhem_set ("Home modeAlarm armhome"); #Home = FHEM Device vom Typ homemode
fhem_set ("AlarmModehistory add Haustür abgeschlossen - armHome gesetzt"); #Toastmessage
fhem_set ("AlarmEnabler on"); #für Wago umschaltung auf Blinklicht am Sensor
}
}
confirm {
if ([validKey] eq "true" and [?Home:alarmState] eq "disarm" and [?MainDoorClosed] eq "off") {
fhem_set ("Home modeAlarm confirm");
fhem_set ("AlarmModehistory add scharf schalten Anfrage gestellt - confirm gesetzt");
UDP_Msg ("192.168.1.194","green")
}
}
armAway {
if ([?Home:alarmState] eq "confirmed" and [MainDoorLocked] eq "on") {
fhem_set ("Home modeAlarm armAway");
fhem_set ("AlarmModehistory add Haustür abgeschlossen, niemand mehr zuhause - armaway gesetzt");
fhem_set ("AlarmEnabler on");
}
}
disarm {
if ([?Home:alarmState] eq "armhome" and [MainDoorLocked] eq "on" and [AlarmDisabler] eq "on") {
fhem_set ("Home modeAlarm disarm");
fhem_set ("AlarmModehistory add durch Taster unscharf geschaltet - disarm gesetzt");
fhem_set ("AlarmEnabler off"); #Wago blinklicht aus
}
if ([validKey] eq "true" and [?Home:alarmState] eq "armaway") {
fhem_set ("Home modeAlarm disarm");
fhem_set ("AlarmModehistory add durch validKey unscharf geschaltet - disarm gesetzt");
fhem_set ("AlarmEnabler off"); #Wago blinklicht aus
UDP_Msg ("192.168.1.194","green")
}
}
FUUID 636529b3791db8d33d
MODEL Perl
NAME entryControl
NOTIFYDEV validKey,MainDoorLocked,global,AlarmDisabler
NR 11887
NTFY_ORDER 50-entryControl
STATE initialized
TYPE DOIF
VERSION 26444 2022-09-25 16:29:19
eventCount 48
Helper:
DBLOG:
block_05:
logdb:
TIME 1667655934.81721
VALUE condition c05: Undefined subroutine &DOIF::UDP_Msg called, line 1.
block_confirm:
logdb:
TIME 1667666339.09272
VALUE condition c02: Undefined subroutine &DOIF::UDP_Msg called, line 5.
cmd:
logdb:
TIME 1667574195.06163
VALUE 0
mode:
logdb:
TIME 1667666649.19747
VALUE enabled
state:
logdb:
TIME 1667574195.06163
VALUE initialized
READINGS:
2022-11-05 17:44:09 Device validKey
2022-11-05 17:44:09 block_confirm executed
2022-11-05 17:44:09 block_disarm executed
2022-11-05 17:44:09 e_validKey_STATE false
2022-11-05 17:44:09 mode enabled
2022-11-05 17:44:09 state initialized
Regex:
accu:
collect:
cond:
AlarmDisabler:
3:
&STATE ^AlarmDisabler$
MainDoorLocked:
0:
&STATE ^MainDoorLocked$
2:
&STATE ^MainDoorLocked$
3:
&STATE ^MainDoorLocked$
validKey:
0:
1:
&STATE ^validKey$
2:
3:
&STATE ^validKey$
condition:
0
if (::ReadingValDoIf($hash,'Home','alarmState') eq "disarm" and ::InternalDoIf($hash,'MainDoorLocked','STATE') eq "on") {
fhem_set ("Home modeAlarm armhome"); #Home = FHEM Device vom Typ homemode
fhem_set ("AlarmModehistory add Haustür abgeschlossen - armHome gesetzt"); #Toastmessage
fhem_set ("AlarmEnabler on"); #für Wago umschaltung auf Blinklicht am Sensor
}
1
if (::InternalDoIf($hash,'validKey','STATE') eq "true" and ::ReadingValDoIf($hash,'Home','alarmState') eq "disarm" and ::InternalDoIf($hash,'MainDoorClosed','STATE') eq "off") {
fhem_set ("Home modeAlarm confirm");
fhem_set ("AlarmModehistory add scharf schalten Anfrage gestellt - confirm gesetzt");
UDP_Msg ("192.168.1.194","green")
}
2
if (::ReadingValDoIf($hash,'Home','alarmState') eq "confirmed" and ::InternalDoIf($hash,'MainDoorLocked','STATE') eq "on") {
fhem_set ("Home modeAlarm armAway");
fhem_set ("AlarmModehistory add Haustür abgeschlossen, niemand mehr zuhause - armaway gesetzt");
fhem_set ("AlarmEnabler on");
}
3
if (::ReadingValDoIf($hash,'Home','alarmState') eq "armhome" and ::InternalDoIf($hash,'MainDoorLocked','STATE') eq "on" and ::InternalDoIf($hash,'AlarmDisabler','STATE') eq "on") {
fhem_set ("Home modeAlarm disarm");
fhem_set ("AlarmModehistory add durch Taster unscharf geschaltet - disarm gesetzt");
fhem_set ("AlarmEnabler off"); #Wago blinklicht aus
}
if (::InternalDoIf($hash,'validKey','STATE') eq "true" and ::ReadingValDoIf($hash,'Home','alarmState') eq "armaway") {
fhem_set ("Home modeAlarm disarm");
fhem_set ("AlarmModehistory add durch validKey unscharf geschaltet - disarm gesetzt");
fhem_set ("AlarmEnabler off"); #Wago blinklicht aus
UDP_Msg ("192.168.1.194","green")
}
helper:
NOTIFYDEV validKey,MainDoorLocked,global,AlarmDisabler
event cmd_nr: 6,cmd: 6,cmd_event: ESPMainDoor,false
globalinit 1
last_timer 0
sleeptimer -1
triggerDev validKey
triggerEvents:
cmd_nr: 6
cmd: 6
cmd_event: ESPMainDoor
false
triggerEventsState:
cmd_nr: 6
cmd: 6
cmd_event: ESPMainDoor
state: false
internals:
all MainDoorLocked:STATE validKey:STATE MainDoorClosed:STATE AlarmDisabler:STATE
perlblock:
0 armHome
1 confirm
2 armAway
3 disarm
powerMap:
readings:
readingsDesc:
energy:
rtype whr
power:
rtype w
trigger:
uiState:
uiTable:
Attributes:
Bekomme noch ne Fehlermeldung - UDP_msg ist eine sub in 99_myUtils, wie kann ich dem DOIF sagen das es dort schauen soll, oder sollte ich das direkt in diesem DOIF verarbeiten?
sub UDP_msg:
sub UDP_Msg($$)
{
my ($dest,$cmd) = @_;
eval "require IO::Socket::INET";
if($@) {
Log 1, $@;
return "Can't load IO::Socket::INET"
}
my $sock = IO::Socket::INET->new(
Proto => 'udp',
PeerPort => 12345,
PeerAddr => $dest
);
if(!$sock) {
return "something went wrong"
}
$sock->send($cmd);
$sock->close();
return ""
}
Im Perlmodus bist du im DOIF-Package. Deine Routine ist im Package main, daher musst du angaben:
::UDP_Msg ("192.168.1.194","green")
sehr schön, es nimmt formen an ;) Tausend Dank!
Ich hab jetzt einen block openDoor hinzugefügt, der bereitet mir noch sorgen - doorOpen ist ein Türöffner, er soll 2sek aktiviert sein.
Da kommt es offensichtlich auch zu mehreren durchläufen, der Türöffner schaltet im 2sek takt - wie bekomm ich es hin den Pfad nur einmal auszuführen..?
openDoor {
if ([?Home:alarmState] eq "disarm" and [?MainDoorLocked] eq "off" and [validKey] eq "true") {
fhem_set ("openDoor on");
[+2];fhem_set ("openDoor off");
fhem_set ("AlarmModehistory add Tueroeffner betaetigt - ");
}
Um das Verhindern von Wiederholungen musst du dich im Perlmodus selbst kümmern. Dazu musst du dir einen Merker setzen, den du abfragst:
{
if (get_Reading("b1") != 1 and sonst was ....) {
set_Reading ("b1",1);
...
}
}
In einem anderen Block musst du den Merker wieder auf 0 setzen, damit der Block wieder ausgeführt werden kann.
Verzögerungen werden im Perlblock mit Hilfe der Funktion set_Exec realisiert.
Wenn du erfolgreich den Perlmodus nutzen willst, dann solltest du dir die Referenz dazu gut zu Gemüte führen:
https://wiki.fhem.de/wiki/DOIF/Perl-Modus
Sehr Cool - Danke erstmal soweit..
Jetzt gehts ans erproben, danach an eine kleine Visualisierung...
Am liebsten wäre mir dieses DOIF jetzt noch ein bisschen aufzubohren und um weitere funktionen zu erweitern.
Da wäre z.b. die Zuordnung gelesener Schlüssel zu Personen - derzeit habe ich hierfür ja ein eigenes DOIF ( validKey ) erstellt. Das könnte dann entfallen.
Ausserdem wäre es toll wenn die auswertung der offenen Fenster in diesem DOIF platz findet, dazu würde dann auch die möglichkeit gehören eine entsprechende Meldung ( welches Fenster offen ist ) via msg Befehl mittles Telegram an denjenigen zu senden der versucht das Haus zu verriegeln...
Die möglichen UDP Messages vom und zum ESP32 Maindoor und ESP GardenDoor wären hier auch gut integriert.
Was denkst Du Damian?
Zitat von: der-Lolo am 07 November 2022, 11:39:14
Am liebsten wäre mir dieses DOIF jetzt noch ein bisschen aufzubohren und um weitere funktionen zu erweitern.
Da wäre z.b. die Zuordnung gelesener Schlüssel zu Personen - derzeit habe ich hierfür ja ein eigenes DOIF ( validKey ) erstellt. Das könnte dann entfallen.
Ausserdem wäre es toll wenn die auswertung der offenen Fenster in diesem DOIF platz findet, dazu würde dann auch die möglichkeit gehören eine entsprechende Meldung ( welches Fenster offen ist ) via msg Befehl mittles Telegram an denjenigen zu senden der versucht das Haus zu verriegeln...
Die möglichen UDP Messages vom und zum ESP32 Maindoor und ESP GardenDoor wären hier auch gut integriert.
Was denkst Du Damian?
Du kannst beliebig viele Blöcke in einem DOIF einbauen, die unabhängig von einander funktionieren, allerdings macht es durchaus Sinn, Dinge die funktional unabhängig voneinander sind, in separaten DOIFs zu definieren.