Zirkulationspumpe nach Anwesenheit (Bewegungsmeldern) steuern

Begonnen von Tobias, 26 April 2017, 18:55:22

Vorheriges Thema - Nächstes Thema

Tobias

Hi,
ich habe bei mir in den Fluren je einen Bewegungsmelder verbaut. Wenn einer von beiden BEwegung meldet, soll die Pumpe angehen. Wenn beide ein "noMotion" melden, und dieser Status innerhalb der nächsten 30min nicht wieder zurück auf "motion" wechselt, soll die Pumpe ausgehen.

Soweit so gut, nun wird aber der 30min wait-timer bei jedem Status noMotion erneut mit den 30min gestartet. Aber das "do resetwait" muss ich imho ja setzen, damit bei einem wechsel von motion auf noMotion bzw wieder zurück, der Timer wieder gelöscht wird.

Wo ist mein denkfehler?
Internals:
   CFGFN
   DEF        ([SW_HZ_WWZirkulation] eq "off" and ([BM_EG_Flur] eq "motion" or [BM_OG_Flur] eq "motion")) (set SW_HZ_WWZirkulation on)
DOELSEIF
([SW_HZ_WWZirkulation] eq "on" and ([BM_EG_Flur] eq "noMotion" and [BM_OG_Flur] eq "noMotion")) (set SW_HZ_WWZirkulation off)
DOELSE
   NAME       DOIF_SW_HZ_WWZirkulation
   NR         69182
   NTFY_ORDER 50-DOIF_SW_HZ_WWZirkulation
   STATE      initialized
   TYPE       DOIF
   Helper:
     Dblog:
       Cmd:
         Dblog:
           TIME       1493105866.80177
           VALUE      0
       State:
         Dblog:
           TIME       1493105866.80177
           VALUE      initialized
   Readings:
     2017-04-26 18:53:06   Device          SW_HZ_WWZirkulation
     2017-04-26 18:46:07   cmd             0
     2017-04-26 18:51:42   e_BM_EG_Flur_STATE noMotion
     2017-04-26 18:49:55   e_BM_OG_Flur_STATE noMotion
     2017-04-26 18:53:06   e_SW_HZ_WWZirkulation_STATE on
     2017-04-26 18:46:07   state           initialized
     2017-04-26 18:53:06   wait_timer      26.04.2017 19:23:06 cmd_2 SW_HZ_WWZirkulation
   Condition:
     0          InternalDoIf($hash,'SW_HZ_WWZirkulation','STATE') eq "off" and (InternalDoIf($hash,'BM_EG_Flur','STATE') eq "motion" or InternalDoIf($hash,'BM_OG_Flur','STATE') eq "motion")
     1          InternalDoIf($hash,'SW_HZ_WWZirkulation','STATE') eq "on" and (InternalDoIf($hash,'BM_EG_Flur','STATE') eq "noMotion" and InternalDoIf($hash,'BM_OG_Flur','STATE') eq "noMotion")
   Devices:
     0           SW_HZ_WWZirkulation BM_EG_Flur BM_OG_Flur
     1           SW_HZ_WWZirkulation BM_EG_Flur BM_OG_Flur
     all         SW_HZ_WWZirkulation BM_EG_Flur BM_OG_Flur
   Do:
     0:
       0          set SW_HZ_WWZirkulation on
     1:
       0          set SW_HZ_WWZirkulation off
     2:
       0
Attributes:
   DbLogExclude .*
   cmdState   Zirkulation An|Zirkulation Aus
   do         resetwait
   room       CUL_HM
   wait       0:1800
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Damian

ich würde es so definieren:

([BM_EG_Flur:"motion"] or [BM_OG_Flur:"motion"]) (set SW_HZ_WWZirkulation on) (set SW_HZ_WWZirkulation off)

do resetwait
wait 0,1800
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tobias

#2
Danke, mal ausprobiert... aber so startet er garnicht mehr einen timer wenn beide noMotion haben...
Beide Bewegungsmelder stehen definitiv auf noMotion
Internals:
   CFGFN
   DEF        ([BM_EG_Flur:"motion"] or [BM_OG_Flur:"motion"]) (set SW_HZ_WWZirkulation on) (set SW_HZ_WWZirkulation off)
   NAME       DOIF_SW_HZ_WWZirkulation
   NR         69182
   NTFY_ORDER 50-DOIF_SW_HZ_WWZirkulation
   STATE      cmd_1
   TYPE       DOIF
   Helper:
     Dblog:
       Cmd:
         Dblog:
           TIME       1493105866.80177
           VALUE      0
       State:
         Dblog:
           TIME       1493105866.80177
           VALUE      initialized
   Readings:
     2017-04-26 19:44:56   Device          BM_OG_Flur
     2017-04-26 19:44:35   cmd             1.2
     2017-04-26 19:44:35   cmd_event       BM_OG_Flur
     2017-04-26 19:44:35   cmd_nr          1
     2017-04-26 19:44:35   cmd_seqnr       2
     2017-04-26 19:43:51   e_BM_EG_Flur_events motion: off,motionDuration: 242,noMotion
     2017-04-26 19:44:56   e_BM_OG_Flur_events battery: ok,brightness: 85,cover: closed
     2017-04-26 19:44:35   state           cmd_1
   Condition:
     0          EventDoIf('BM_EG_Flur',$hash,'motion',1) or EventDoIf('BM_OG_Flur',$hash,'motion',1)
   Devices:
     0           BM_EG_Flur BM_OG_Flur
     all         BM_EG_Flur BM_OG_Flur
   Do:
     0:
       0          set SW_HZ_WWZirkulation on
       1          set SW_HZ_WWZirkulation off
     1:
   Helper:
     event      battery: ok,brightness: 85,cover: closed
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   BM_OG_Flur
     timerevent motion: off
     triggerDev BM_OG_Flur
     timerevents:
       motion: off
       motionDuration: 242
       noMotion
     timereventsState:
       motion: off
       motionDuration: 242
       state: noMotion
     triggerEvents:
       battery: ok
       brightness: 85
       cover: closed
     triggerEventsState:
       battery: ok
       brightness: 85
       cover: closed
   Internals:
   Itimer:
   Readings:
   Regexp:
     0:
     All:
   State:
   Trigger:
     all         BM_EG_Flur BM_OG_Flur
Attributes:
   DbLogExclude .*
   cmdState   Zirkulation An|Zirkulation Aus
   do         resetwait
   room       CUL_HM
   wait       0:1800
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Tobias

hmm, hab nochmal geändert, und bei den Bewegungsmeldern das Attr. event-on-change auf "motion" gesetzt, hilft trotzdem nix.
Dadurch das der Timer immer weiter gesetzt wird, kommt praktisch nie das "Aus" Command
([SW_HZ_WWZirkulation] eq "off" and ([BM_EG_Flur:motion] =~ m/on/ or [BM_OG_Flur:motion] =~ m/on/)) (set SW_HZ_WWZirkulation on)
DOELSEIF
([SW_HZ_WWZirkulation] eq "on" and ([BM_EG_Flur:motion] eq "off" and [BM_OG_Flur:motion] eq "off")) (set SW_HZ_WWZirkulation off)
DOELSE
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Damian

Zitat von: Tobias am 26 April 2017, 19:47:45
Danke, mal ausprobiert... aber so startet er garnicht mehr einen timer wenn beide noMotion haben...
Beide Bewegungsmelder stehen definitiv auf noMotion

wait       0,1800
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tobias

cool, damit funktioniert es. Und der Timer wird auch nicht immer nachkorrigiert ;) Die Pumpe geht pünktlich nach 30min aus.

Warum aber funktioniert das hier? Diese sysntax habe ich nicht verstanden.. Und warum hat mein Beispiel nicht funktioniert? Warum wurde bei mir immer bei jedem Event der Timer nach vor geschoben und bei dir nicht??
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Damian

Zitat von: Tobias am 27 April 2017, 08:50:50
cool, damit funktioniert es. Und der Timer wird auch nicht immer nachkorrigiert ;) Die Pumpe geht pünktlich nach 30min aus.

Warum aber funktioniert das hier? Diese sysntax habe ich nicht verstanden.. Und warum hat mein Beispiel nicht funktioniert? Warum wurde bei mir immer bei jedem Event der Timer nach vor geschoben und bei dir nicht??

Mein Beispiel entspricht dem Beispiel für die Nachbildung eines on-for-timers aus der DOIF-Commandref.

Im Gegensatz zu deiner Lösung gibt es hier nur einen DOIF-Zweig, allerdings als eine Befehlssequenz. In der Befehlssequenz wird der erste Befehl sofort ausgeführt, der zweite verzögert (deswegen ein Komma bei wait und kein Doppelpunkt). Mit do resetwait wird ein laufender Timer neu gesetzt, hier also für den zweiten set-Befehl zum Ausschalten, der erste Befehl der Sequenz wird in diesem Fall nicht wiederholt, weil die Befehlssequenz aufgrund des laufenden Timers dann noch nicht beendet war.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF