DOIF triggert nur bei jedem zweiten Ereignis

Begonnen von BrandonQuest, 24 Februar 2019, 14:38:16

Vorheriges Thema - Nächstes Thema

Damian

["BDZ_MotionFenster:^motion$"]  Du hättest dir die Beispiele zum Link genauer anschauen sollen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

BrandonQuest

Hi Damian,

Das hatte ich, ich hatte es nur so verstanden, dass beim Setzen ["device:reading"]
komplett in Anführungsstriche mit regulären Ausdrücken gearbeitet werden soll,
setze ich nur das Reading oder den gewünschten State in Anführungsstriche,
n [device:"reading"]könnte ich auch ohne reguläre Ausdrücke das exakte Ergbnis angeben.

Dem ist also nicht so? Ich muss immer mit regulären Ausdrücken arbeiten?
Das gilt dann ausnahmslos für alle Angaben, die ich in meinen DOIFs gemacht habe,
ob in Anführungstrichen oder nicht ob als Zustand oder Event?

Dann bin ich in der Tat recht baff.
Und ich habe mir extra aus der Command-Ref und dem Einsteiger-Leitfaden für DOIF
alles in einem Dokument mit meinen Worten zusammengefasst!
Leichtfertigkeit möchte ich hier nicht suggerieren!

Grüße
Brandon




amenomade

Obwohl Damian dir schon den guten Rat gegeben hat, trotzdem zurück zu den Fragen:

Zu 1: ok, ich verstehe für "on". Aber nicht für "off". Du testest, ob ein oder beide Lichter an sind, und schaltest dann beide aus. Ohne diese Bedingung, würde es nur dazu noch ausschalten, wenn alles schon aus ist. Na und?

Zu 2: ok, verstehe

Zu 3: ist es wichtig zu wissen, welche getriggert hat? Prinzipiell "triggert" ([device] eq "etwas") auch. Aber ok, vielleicht triggert [device] zu viel, wenn dieses Device andere Events generiert und nicht nur motion oder nomotion.

Zu 4: ok, hatte ich übersehen. Wahrscheinlich durch "doif_BDZ_DeckenLicht_on cmd: 1" aus dem Grund, den Damian erklärt hat.

Fazit: kannst alles so lassen (bis auf "^motion$"), es war nur ein Versuch, um das DOIF zu vereinfachen.

Und zuletzt: sobald, Du mit Einführungszeichen arbeitest, wird es als regulare Ausdruck bewertet.
["device:reading"] ist ["<device regex>:<event regex>"]
[device:"reading"] ist [<devicename>:"<event regex>"]


Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

BrandonQuest

Hallo.

vielen Dank für die klaren Worte:

["device:reading"] ist ["<device regex>:<event regex>"]
[device:"reading"] ist [<devicename>:"<event regex>"]

Das ist mir die letzten Wochen wirklich nicht klar gewesen.
Ein Wunder, dass es nicht schon vorher und heftiger zu Problemen gekommen ist.

Ich werde Deine Hinweise zur Vereinfachung mal wirken lassen.
Ich verstehe den Punkt 1, es stimmt was Du schreibst.

Zu 3: auch das war eine Interpreation der Mechanismen, die ich meinte aus
der Dokumentation ziehen zu müssen: dass ich letztendlich eine Art
Statusänderung benötige um einen Trigger zu bekommen.
Zwar können auch Zustände als Trigger dienen, jedoch muss das zugehörige Device
dennoch zumindest über die Änderung eines anderen Parameters auf sich
aufmerksam machen, dann kann ich auch einen statischen Zustand als trigger heranziehen
- meinte ich
(...aus der Command Ref:

,,...Das Modul wird getriggert, sobald das angegebene Device hier "remotecontrol" ein Event erzeugt. Das geschieht, wenn irgendein Reading oder der Status von "remotecontrol" aktualisiert wird. Ausgewertet wird hier der Zustand des Status von remotecontrol nicht das Event selbst...."

Und ich dachte eben ,,eq" eignet sich nur für einen Status und device:"reading" wäre für Events.

Ich schaue, wie weit ich mit Euren Hinweisen komme.
Bin aber guter Dinge, da ich Grundlegendes falsch verstanden hatte
und werde das Ergbnis natürlich hier posten.

Grüße und gute Nacht
Brandon

BrandonQuest

#19
Noch eine Frage:

ich möchte, dass das DOIF nach getaner Arbeit in den cmd 2 wechselt, was es ja eigentlich selbstständig tun sollte.
Tut es aber nicht (ist wohl immer noch ein Kinken drin).

Weder

(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off) (set $SELF cmd_2) DOELSE

noch



(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set $SELF cmd_2) DOELSE

können dies bewirken.

Entweder kläre ich auf, weswegen der Wechsel nicht automatisch geschieht oder die Lösung ginge mit anderen Seiteneffekten einher und ich finde heraus, wie
ich dem DOIF klar mache, dass nach Abarbeiten des cmd 1 in den cmd 2 gewechselt werden soll.

Ich nehme an es klappt bisher nicht, da es sich beißt, wenn der wechsel zu "2" noch in der Abarbeitung von "1" gefordert wird.
Nur zur Info: zusätzlich zur bisherigen Konfiguration habe ich noch selftrigger wait aktiviert, damit die Readings der beteiligten Devices im DOIF auch nach dem Auslösen aktuell gelistet werden.

Hoffentlich schmerzt es Damian nicht zu sehr, sein Modul so vergewaltigt zu sehen...

Damit evt. fehlende Informationen nicht zu Rückfragen zwingen, folgen jetzt im Anschluss nochmal aktuelle Internals und Logs in folgender Reihenfolge:

1. EventLog vom Moment des manuellen Einschaltens des Lichts und Reagieren des Ausschalt-DOIFs (Ausschalten nach 5 Sekunden, wenn nichts passiert), über den fehlgeschlagenen Versuch
des Erzwingens von cmd_2 bis zum selbstständigen Wechsel in cmd_2 nach einiger Zeit.

2. Internals VOR dem Einschalten

3. Internals WÄHREND des aktiven aktiven DOIFs

4. Internals NACH Abarbeitung des DOIFs bzw. wenn es das Licht vom DOIF ausgeschaltet worden ist - aber VOR dem selbstständigen Wechsel in cmd_2, was dann wieder dem Log unter Punkt 2. entspricht.

1:


2019-03-03 09:01:59.591 DOIF doif_BDZ_DeckenLicht_off wait_timer: 03.03.2019 09:02:04 cmd_1 BDZ_DeckenlichtSonoff
2019-03-03 09:01:59.614 MQTT_DEVICE BDZ_DeckenlichtSonoff on
2019-03-03 09:02:04.597 DOIF doif_BDZ_DeckenLicht_off wait_timer: no timer
2019-03-03 09:02:04.649 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 2
2019-03-03 09:02:04.649 DOIF doif_BDZ_DeckenLicht_off cmd: 2
2019-03-03 09:02:04.649 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_DeckenlichtSonoff
2019-03-03 09:02:04.649 DOIF doif_BDZ_DeckenLicht_off cmd_2
2019-03-03 09:02:04.672 MQTT_DEVICE BDZ_DeckenlichtSonoff off
2019-03-03 09:02:04.710 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 2
2019-03-03 09:02:04.710 DOIF doif_BDZ_DeckenLicht_off cmd: 2
2019-03-03 09:02:04.710 DOIF doif_BDZ_DeckenLicht_off cmd_event: set_cmd_2
2019-03-03 09:02:04.710 DOIF doif_BDZ_DeckenLicht_off cmd_2
2019-03-03 09:02:04.728 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 1
2019-03-03 09:02:04.728 DOIF doif_BDZ_DeckenLicht_off cmd: 1
2019-03-03 09:02:04.728 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_DeckenlichtSonoff
2019-03-03 09:02:04.728 DOIF doif_BDZ_DeckenLicht_off cmd_1
2019-03-03 09:02:08.198 HUEDevice BDZ_LuxTuer lightlevel: 3433
2019-03-03 09:02:08.198 HUEDevice BDZ_LuxTuer lux: 2
2019-03-03 09:02:08.198 HUEDevice BDZ_LuxTuer daylight: 0
2019-03-03 09:02:08.198 HUEDevice BDZ_LuxTuer dark: 1
2019-03-03 09:02:13.144 HUEDevice BDZ_LuxFenster lightlevel: 4573
2019-03-03 09:02:13.144 HUEDevice BDZ_LuxFenster lux: 3
2019-03-03 09:02:13.144 HUEDevice BDZ_LuxFenster dark: 1
2019-03-03 09:02:13.144 HUEDevice BDZ_LuxFenster daylight: 0
2019-03-03 09:02:38.236 MQTT Mosquitto connection: active
2019-03-03 09:03:38.237 MQTT Mosquitto connection: active
2019-03-03 09:04:17.160 HUEDevice BDZ_TempFenster temperature: 21.16
2019-03-03 09:04:38.241 MQTT Mosquitto connection: active
2019-03-03 09:05:14.078 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 2
2019-03-03 09:05:14.078 DOIF doif_BDZ_DeckenLicht_off cmd: 2
2019-03-03 09:05:14.078 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_MotionTuer
2019-03-03 09:05:14.078 DOIF doif_BDZ_DeckenLicht_off cmd_2
2019-03-03 09:05:14.101 HUEDevice BDZ_MotionTuer nomotion
2019-03-03 09:05:14.908 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 2
2019-03-03 09:05:14.908 DOIF doif_BDZ_DeckenLicht_off cmd: 2
2019-03-03 09:05:14.908 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_MotionFenster
2019-03-03 09:05:14.908 DOIF doif_BDZ_DeckenLicht_off cmd_2
2019-03-03 09:05:14.931 HUEDevice BDZ_MotionFenster nomotion


2:


Internals:
   DEF        (
(
([BDZ_MotionTuer:"^nomotion$"] and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_MotionFenster:"^nomotion$"] and [?BDZ_MotionTuer] eq "nomotion")
or
([BDZ_SpiegelschrankSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_DeckenlichtSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
)
and
([?BDZ_DeckenlichtSonoff] eq "on" or [?BDZ_SpiegelschrankSonoff] eq "on")
and
AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0
)
(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set $SELF cmd_2) DOELSE
   FUUID      5c74116f-f33f-d24e-34a0-49a85c6c1759028d
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_off
   NR         88
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_off
   STATE      cmd_2
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-03 09:05:14   Device          BDZ_MotionFenster
     2019-03-03 09:05:14   cmd             2
     2019-03-03 09:05:14   cmd_event       BDZ_MotionFenster
     2019-03-03 09:05:14   cmd_nr          2
     2019-03-03 09:02:04   e_BDZ_DeckenlichtSonoff_STATE off
     2019-03-03 09:02:04   e_BDZ_DeckenlichtSonoff_events off
     2019-03-03 09:05:14   e_BDZ_MotionFenster_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionFenster_events nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_events nomotion
     2019-03-03 09:01:36   mode            enabled
     2019-03-03 09:05:14   state           cmd_2
     2019-03-03 09:02:04   wait_timer      no timer
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0            ( (::EventDoIf('BDZ_MotionTuer',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_MotionFenster',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion") or (::EventDoIf('BDZ_SpiegelschrankSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_DeckenlichtSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") ) and (::InternalDoIf($hash,'BDZ_DeckenlichtSonoff','STATE') eq "on" or ::InternalDoIf($hash,'BDZ_SpiegelschrankSonoff','STATE') eq "on") and AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0 
   devices:
     0           BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   do:
     0:
       0          set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set doif_BDZ_DeckenLicht_off cmd_2
     1:
       0         
   helper:
     event      nomotion
     globalinit 1
     last_timer 0
     sleepdevice BDZ_DeckenlichtSonoff
     sleepsubtimer -1
     sleeptimer -1
     timerdev   BDZ_MotionFenster
     timerevent nomotion
     triggerDev BDZ_MotionFenster
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: BDZ_MotionFenster
       state: cmd_2
     timerevents:
       nomotion
     timereventsState:
       state: nomotion
     triggerEvents:
       nomotion
     triggerEventsState:
       state: nomotion
   internals:
     0           BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
     all         BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
   itimer:
   readings:
   trigger:
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   uiState:
   uiTable:
Attributes:
   alias      Deckenlicht AUS
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   do         resetwait
   group      A) Logik Beleuchtungssteuerung
   icon       helper_doif
   room       50_Badezimmer
   selftrigger wait
   startup    set $SELF cmd_2
   wait       5



3:


Internals:
   DEF        (
(
([BDZ_MotionTuer:"^nomotion$"] and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_MotionFenster:"^nomotion$"] and [?BDZ_MotionTuer] eq "nomotion")
or
([BDZ_SpiegelschrankSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_DeckenlichtSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
)
and
([?BDZ_DeckenlichtSonoff] eq "on" or [?BDZ_SpiegelschrankSonoff] eq "on")
and
AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0
)
(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set $SELF cmd_2) DOELSE
   FUUID      5c74116f-f33f-d24e-34a0-49a85c6c1759028d
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_off
   NR         88
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_off
   STATE      cmd_2
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-03 09:08:19   Device          BDZ_DeckenlichtSonoff
     2019-03-03 09:05:14   cmd             2
     2019-03-03 09:05:14   cmd_event       BDZ_MotionFenster
     2019-03-03 09:05:14   cmd_nr          2
     2019-03-03 09:08:19   e_BDZ_DeckenlichtSonoff_STATE on
     2019-03-03 09:08:19   e_BDZ_DeckenlichtSonoff_events on
     2019-03-03 09:05:14   e_BDZ_MotionFenster_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionFenster_events nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_events nomotion
     2019-03-03 09:01:36   mode            enabled
     2019-03-03 09:05:14   state           cmd_2
     2019-03-03 09:08:19   wait_timer      03.03.2019 09:08:24 cmd_1 BDZ_DeckenlichtSonoff
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0            ( (::EventDoIf('BDZ_MotionTuer',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_MotionFenster',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion") or (::EventDoIf('BDZ_SpiegelschrankSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_DeckenlichtSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") ) and (::InternalDoIf($hash,'BDZ_DeckenlichtSonoff','STATE') eq "on" or ::InternalDoIf($hash,'BDZ_SpiegelschrankSonoff','STATE') eq "on") and AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0 
   devices:
     0           BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   do:
     0:
       0          set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set doif_BDZ_DeckenLicht_off cmd_2
     1:
       0         
   helper:
     event      on
     globalinit 1
     last_timer 0
     sleepdevice BDZ_DeckenlichtSonoff
     sleepsubtimer 0
     sleeptimer 0
     timerdev   BDZ_DeckenlichtSonoff
     timerevent on
     triggerDev BDZ_DeckenlichtSonoff
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: BDZ_MotionFenster
       state: cmd_2
     timerevents:
       on
     timereventsState:
       state: ON
     triggerEvents:
       on
     triggerEventsState:
       state: ON
   internals:
     0           BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
     all         BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
   itimer:
   readings:
   trigger:
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   uiState:
   uiTable:
Attributes:
   alias      Deckenlicht AUS
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   do         resetwait
   group      A) Logik Beleuchtungssteuerung
   icon       helper_doif
   room       50_Badezimmer
   selftrigger wait
   startup    set $SELF cmd_2
   wait       5



4:


Internals:
   DEF        (
(
([BDZ_MotionTuer:"^nomotion$"] and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_MotionFenster:"^nomotion$"] and [?BDZ_MotionTuer] eq "nomotion")
or
([BDZ_SpiegelschrankSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_DeckenlichtSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
)
and
([?BDZ_DeckenlichtSonoff] eq "on" or [?BDZ_SpiegelschrankSonoff] eq "on")
and
AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0
)
(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set $SELF cmd_2) DOELSE
   FUUID      5c74116f-f33f-d24e-34a0-49a85c6c1759028d
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_off
   NR         88
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_off
   STATE      cmd_1
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-03 09:08:24   Device          BDZ_DeckenlichtSonoff
     2019-03-03 09:08:24   cmd             1
     2019-03-03 09:08:24   cmd_event       BDZ_DeckenlichtSonoff
     2019-03-03 09:08:24   cmd_nr          1
     2019-03-03 09:08:24   e_BDZ_DeckenlichtSonoff_STATE off
     2019-03-03 09:08:24   e_BDZ_DeckenlichtSonoff_events off
     2019-03-03 09:05:14   e_BDZ_MotionFenster_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionFenster_events nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_events nomotion
     2019-03-03 09:01:36   mode            enabled
     2019-03-03 09:08:24   state           cmd_1
     2019-03-03 09:08:24   wait_timer      no timer
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0            ( (::EventDoIf('BDZ_MotionTuer',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_MotionFenster',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion") or (::EventDoIf('BDZ_SpiegelschrankSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_DeckenlichtSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") ) and (::InternalDoIf($hash,'BDZ_DeckenlichtSonoff','STATE') eq "on" or ::InternalDoIf($hash,'BDZ_SpiegelschrankSonoff','STATE') eq "on") and AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0 
   devices:
     0           BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   do:
     0:
       0          set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set doif_BDZ_DeckenLicht_off cmd_2
     1:
       0         
   helper:
     event      off
     globalinit 1
     last_timer 0
     sleepdevice BDZ_DeckenlichtSonoff
     sleepsubtimer -1
     sleeptimer -1
     timerdev   BDZ_DeckenlichtSonoff
     timerevent off
     triggerDev BDZ_DeckenlichtSonoff
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: BDZ_DeckenlichtSonoff
       state: cmd_1
     timerevents:
       off
     timereventsState:
       state: OFF
     triggerEvents:
       off
     triggerEventsState:
       state: OFF
   internals:
     0           BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
     all         BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
   itimer:
   readings:
   trigger:
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   uiState:
   uiTable:
Attributes:
   alias      Deckenlicht AUS
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   do         resetwait
   group      A) Logik Beleuchtungssteuerung
   icon       helper_doif
   room       50_Badezimmer
   selftrigger wait
   startup    set $SELF cmd_2
   wait       5



Ich danke für's Lesen

Grüße
Brandon

Damian

Das Absetzen von set $SELF ... aus dem DOIF selbst ist keine gute Idee, denn die eigentliche Abarbeitung des Befehls ist zu diesem Zeitpunkt nicht abgeschlossen und der Status noch nicht gesetzt. Auch mit Selftrigger entsteht eine Rekursion, die nur durch waittimer ausgehebelt werden kann.

Wenn du komplexere Dinge mit DOIF erstellen willst, so bietet sich der Perl-Modus an, hier kannst du dich nach Belieben austoben indem du strukturiert programmierst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

BrandonQuest

Danke,

ich komme nur langsam vom 100sten ins 1000ste und bin mir nicht sicher ob fhem das geeignete Tool ist.
Mein Anspruch scheint mir doch nicht so hoch gegriffen.

Bei dem Versuch nun, das DOIF in Perl zu versetzen, habe ich Probleme damit, die Aktion zu definieren:

(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off)


Ich habe jetzt alles durchgeackert und finde kein Beispiel, wie ich zwei Befehle im "Perl-DOIF" an fhem weitergebe!
Es gibt immer nur Beispiele mit EINEM Befehl.

Und da fhem_set wohl ein eigenständiger Befehl der DOIFs ist (andere Perl-Erklärungen haben {fhem("set...."} als Grundlage)
ist die Menge meiner Suchergebnisse auch recht eingeschränkt.

Weder

{ fhem_set"BDZ_DeckenlichtSonoff off"};{ fhem_set"BDZ_SpiegelschrankSonoff off"}



{ fhem_set"BDZ_DeckenlichtSonoff off"};;{ fhem_set"BDZ_SpiegelschrankSonoff off"}



{fhem_set"BDZ_DeckenlichtSonoff off, BDZ_SpiegelschrankSonoff off"}



{fhem_set"BDZ_DeckenlichtSonoff off" ; "BDZ_SpiegelschrankSonoff off"}


BrandonQuest

ok, ok - jetzt hat DAS zumindest schonmal geklappt:


{ fhem_set"BDZ_DeckenlichtSonoff off";
fhem_set"BDZ_SpiegelschrankSonoff off";
}

Damian

Zitat von: BrandonQuest am 03 März 2019, 14:50:47
ok, ok - jetzt hat DAS zumindest schonmal geklappt:


{ fhem_set"BDZ_DeckenlichtSonoff off";
fhem_set"BDZ_SpiegelschrankSonoff off";
}


Und nicht zu viel auf einmal vornehmen, Rom wurde auch nicht an einem Tag erbaut ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

BrandonQuest

#24
Ich würde mal sagen, die Realisierung des Timers mit Abbruchbedingung ist wohl schon der Bau Roms :-/

Mein Kenntnisstand dürfte klar sein, dass ich mich damit übernehme wohl auch.
Habe versucht auf Github vielleicht eine Eingebung durch Studium Deines Moduls zu bekommen - das grenzt wohl aber etwas an Größenwahn.

Ich wollte mir etwas auf Basis

attr BDZ_MotionTuer userReadings Zeit {if (ReadingsVal("$NAME","state","0") eq "nomotion") {time_str2num (ReadingsTimestamp ("$NAME","state","0"))}}

(dass hatte ich mir vor einigen Tagen zum Erfassen eines Zeitintervalls nach Reading-Aktualisierung im Device gebastelt und ist jetzt obsolet)

nehmen, in die if-Abfrage in Perl überführen und die Timerdauer draufschlagen.

Ich bin allerdings 1. noch dabei es zum Laufen zu bekommen und weiß 2. nicht,
wie ich die Timerschleife dann zum laufen bekomme ohne Gefahr zu laufen, dass alle anderen Prozesse solange stillstehen.

BrandonQuest

Den Timer inkl. Reset habe ich nun ganz simpel so realisiert:


{fhem ("defmod Timer_BDZ_DeckenlichtSonoff at +00:01 set BDZ_DeckenlichtSonoff off ;; set BDZ_SpiegelschrankSonoff off");}

BrandonQuest

#26
Wie sieht ein simpler negierender RegEx aus?

Ich möchte im DOIF einfach nur sagen: "Trigger bei allem, was NICHT off ist"

Nach so einleuchtenden Beispielen wie:
...
(["^FS$:^temp$"] triggert auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt
...
Dachte ich es wäre einfach mit

([BDZ_DeckenlichtSonoff:"!off"])
oder
([BDZ_DeckenlichtSonoff:"(?!off)"])
oder
([BDZ_DeckenlichtSonoff:"\b(?!off\b).*\b"])
oder
([BDZ_DeckenlichtSonoff:"[^o][^f][^f]"])


Aber ich komme nicht weiter :-(

EDIT: ich habe erstmal als workaround statt auf einen negativen RegEx zu schauen, die komplette Bedingung negiert:
!([BDZ_DeckenlichtSonoff:"off"])

Aber es wäre dennoch nett zu wissen, wie sich das mit dem RegEx verhalten hätte...

Damian

Zitat von: BrandonQuest am 04 März 2019, 09:57:21
Wie sieht ein simpler negierender RegEx aus?

Ich möchte im DOIF einfach nur sagen: "Trigger bei allem, was NICHT off ist"

Nach so einleuchtenden Beispielen wie:
...
(["^FS$:^temp$"] triggert auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt
...
Dachte ich es wäre einfach mit

([BDZ_DeckenlichtSonoff:"!off"])
oder
([BDZ_DeckenlichtSonoff:"(?!off)"])
oder
([BDZ_DeckenlichtSonoff:"\b(?!off\b).*\b"])
oder
([BDZ_DeckenlichtSonoff:"[^o][^f][^f]"])


Aber ich komme nicht weiter :-(

Als Zustandstrigger [FS:state] ne "on", Negation von RegEx ist schwierig.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: BrandonQuest am 02 März 2019, 21:29:37Ich habe nun jeweils ein DOIF um das Licht einzuschalten und ein DOIF, welches für das Ausschalten zuständig ist.
Warum? Pack das in ein DOIF. Das ist doch der Vorteil ggü. notify.