FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: der-Lolo am 04 November 2022, 18:48:04

Titel: komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: der-Lolo am 04 November 2022, 18:48:04
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.








Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: Damian am 04 November 2022, 19:56:10
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.
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: der-Lolo am 04 November 2022, 20:14:21
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





Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: Damian am 04 November 2022, 20:33:22
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");
  }
}
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag 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 ;)

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.
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: Damian am 04 November 2022, 21:06:48
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 ....) {...
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: der-Lolo am 04 November 2022, 22:41:33
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.
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: der-Lolo am 05 November 2022, 15:32:34
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.

 
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: Damian am 05 November 2022, 16:51:21
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","")
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: der-Lolo am 05 November 2022, 17:45:47
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 ""
}
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: Damian am 05 November 2022, 18:21:30
Im Perlmodus bist du im DOIF-Package. Deine Routine ist im Package main, daher musst du angaben:

::UDP_Msg ("192.168.1.194","green")

Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: der-Lolo am 05 November 2022, 22:04:26
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 - ");
}
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: Damian am 06 November 2022, 08:43:00
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
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: der-Lolo am 06 November 2022, 21:41:44
Sehr Cool - Danke erstmal soweit..

Jetzt gehts ans erproben, danach an eine kleine Visualisierung...
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag 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?
Titel: Antw:komplexe Alarmanlage - DOIF im Perl Modus
Beitrag von: Damian am 07 November 2022, 17:39:36
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.