DOIF: (Verständnis?-) Problem mit wait-timer

Begonnen von Michi240281, 13 März 2015, 14:51:39

Vorheriges Thema - Nächstes Thema

flurin

#30
... work-in-progress > folgende Variante kann ich noch bieten:


define Zirku_Pumpe_auto DOIF ([Abwesend:state] eq "nein" and [Urlaub:state] eq "nein" and
  ([Status_Warmwasserpumpe:state:?an] or [+01:00] and [Status_Warmwasser:state] eq "an"))
(set Zirkulationspumpe_WW on-for-timer 300)
attr Zirku_Pumpe_auto do always


Michi240281

Das DOIF wurde tatsächlich über Abwesend getriggert, aber unabsichtlich. Die Ursache dafür war addlog! Ich habe das jetzt mal folgendermaßen abgeändert:

define Zirku_Pumpe_auto_neu DOIF ([?Abwesend:state] eq "nein" and [?Urlaub:state] eq "nein" and [Status_Warmwasser:state] eq "an")
(set Zirkulationspumpe_WW on-for-timer 600, sleep 3600;trigger Abwesend)


Dann sollte nur noch der Status_Warmwasser zur Triggerung führen. Bin mal gespannt, ob das dann so funktioniert.

@Damian: Was bewirkt das "trigger Abwesend"?

@Flurin: Danke für deine Mühen, leider funktioniert dein Code nicht, er wird erst garnicht akzeptiert! Da scheint die Syntax nicht zu stimmen!
FHEM auf QNAP per VM / HM LAN Adapter / diverse HM-Devices
QNAP TVS 463
VU+ Duo4kSE
Sony 75ZD9

flurin

Zitat von: Michi240281 am 24 März 2015, 22:34:09
@Flurin: Danke für deine Mühen, leider funktioniert dein Code nicht, er wird erst garnicht akzeptiert! Da scheint die Syntax nicht zu stimmen!

OK, vermutlich liegt es am [Status_Warmwasserpumpe:state:?an], es müsste [Status_Warmwasserpumpe:?an] heissen.
Falls Du diese Lösung weiterverfolgen möchtest, kann ich immer noch meine Testversion posten.



flurin

#33
Hier eine Testversion, die ansatzweise zur Lösung des Problems helfen könnte:

Es geht darum, einen Befehl nach einem Event sofort auszuführen und in einem Intervall zu wiederholen:

Dummy-Definition für den Test:

define du_event dummy
attr du_event setList on off

define du_interval dummy
set du_interval 00:00:05


DOIF:

define di_pulse DOIF ([du_event:?on] or [+[du_interval]] and [du_event] eq "on")
  ({Log(3,"command")}, set du_interval 00:00:05)
attr di_pulse do always


Einfach ausprobieren und nach Bedarf ausbauen/anpassen.

Gruss
flurin

Brockmann

Zitat von: Michi240281 am 24 März 2015, 22:34:09
define Zirku_Pumpe_auto_neu DOIF ([?Abwesend:state] eq "nein" and [?Urlaub:state] eq "nein" and [Status_Warmwasser:state] eq "an")
(set Zirkulationspumpe_WW on-for-timer 600, sleep 3600;trigger Abwesend)

Dann sollte nur noch der Status_Warmwasser zur Triggerung führen. Bin mal gespannt, ob das dann so funktioniert.
Nee, das wird so nichts werden. Das trigger Abwesend bewirkt, dass das DOIF 3600 Sekunden nach Einschalten der Pumpe erneut getriggert wird. Sind die Bedingungen dann immer noch alle erfüllt, schaltet die Pumpe erneut für 5 Minuten ein. Wenn Du die Bedingung Abwesend auf non-triggering setzt (mit dem Fragezeichen), dann klappt das nicht mehr.
Du könntest aber statt trigger Abwesend einfach trigger Status_Warmwasser verwenden, das hat denselben Effekt. Dann sollte es rundlaufen, sofern Status_Warmwasser nicht anderweitig getriggert wird.

ABER Seiteneffekt: Wenn Du nach Hause kommst (also Abwesend auf "nein" geht), springt die Pumpe nicht direkt an, sondern erst wieder, wenn Sie das nächste Mal durch Status_Warmwasser getriggert wird. Ist also vermutlich auch noch nicht ganz das, was Du willst.
Du solltest besser versuchen, dieses zyklische Triggern von Abwesend zu vermeiden. Das ist nämlich das, was Dir von Anfang an immer wieder Probleme eingebrockt hat.

Damian

#35
Zitat von: Michi240281 am 24 März 2015, 22:34:09
@Damian: Was bewirkt das "trigger Abwesend"?

Mit trigger Abwesend wird ein Event für Abwesend erzeugt. Damit wird das DOIF-Modul getriggert, welches Abwesend abfragt - allerdings ohne Fragezeichenangabe.

Die Idee von Flurin mit indirekter Zeitsteuerung ist nicht schlecht. Damit kommt man ohne Sleep aus, kombiniert mit meinem letzten Vorschlag würde es so aussehen:

1. Dieses Modul soll nur den Zustand on bzw. off haben, abhängig davon ob die Pumpe zirkulieren soll oder nicht. Da kein do always gesetzt wird, ist hier egal wie oft Abwesend triggert.

define Zirku_Pumpe_auto DOIF ([Abwesend:state] eq "nein" and [Urlaub:state] eq "nein" and [Status_Warmwasser:state] eq "an")
attr zirku_Pumpe_auto state on|off


2. Jetzt wird ein Dummy für die zeitliche Wiederholung definiert (hier eine Stunde)

define Intervall dummy
set Intervall 01:00



3. Und nun wird das Haupt-DOIF für das Schalten der Pumpe definiert:

define di_Zirku_Pumpe_on DOIF ([zirku_Pumpe_auto] eq "on" or ([+[Intervall]] and [?Zirku_Pumpe_auto] eq "on") ) (set Zirkulationspumpe_WW on-for-timer 300, trigger Intervall)
attr di_Zirku_Pumpe_on do always


Damit läuft die Pumpe sofort los, wenn der Status von Zirku_Pumpe_auto auf on geht, oder wenn das Intervall von einer Stunde abläuft und der Zirkulationsmodus auf on steht. Mit trigger Intervall wird das Setzen der nächsten Schaltzeit nach einer Stunde über die Intervallzeit provoziert.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

#36
@Damian

Genau so! ich habe nur du_event wie folgt gesetzt:


define di_events DOIF ([du_absent] eq "off" and [du_holiday] eq "off" and [du_hotwater] eq "on")
(set du_event on) DOELSE (set du_event off)


aber das ist ein Detail.

Gruss
flurin

Michi240281

Zitat von: Damian am 25 März 2015, 13:34:17
Mit trigger Abwesend wird ein Event für Abwesend erzeugt. Damit wird das DOIF-Modul getriggert, welches Abwesend abfragt - allerdings ohne Fragezeichenangabe.

Die Idee von Flurin mit indirekter Zeitsteuerung ist nicht schlecht. Damit kommt man ohne Sleep aus, kombiniert mit meinem letzten Vorschlag würde es so aussehen:

1. Dieses Modul soll nur den Zustand on bzw. off haben, abhängig davon ob die Pumpe zirkulieren soll oder nicht. Da kein do always gesetzt wird, ist hier egal wie oft Abwesend triggert.

define Zirku_Pumpe_auto DOIF ([Abwesend:state] eq "nein" and [Urlaub:state] eq "nein" and [Status_Warmwasser:state] eq "an")
attr zirku_Pumpe_auto state on|off


2. Jetzt wird ein Dummy für die zeitliche Wiederholung definiert (hier eine Stunde)

define Intervall dummy
set Intervall 01:00



3. Und nun wird das Haupt-DOIF für das Schalten der Pumpe definiert:

define di_Zirku_Pumpe_on DOIF ([zirku_Pumpe_auto] eq "on" or ([+[Intervall]] and [?Zirku_Pumpe_auto] eq "on") ) (set Zirkulationspumpe_WW on-for-timer 300, trigger Intervall)
attr di_Zirku_Pumpe_on do always


Damit läuft die Pumpe sofort los, wenn der Status von Zirku_Pumpe_auto auf on geht, oder wenn das Intervall von einer Stunde abläuft und der Zirkulationsmodus auf on steht. Mit trigger Intervall wird das Setzen der nächsten Schaltzeit nach einer Stunde über die Intervallzeit provoziert.

Gruß

Damian

Hallo Damian,

vielen Dank für deine Ideen und den Code! Werde ich heute Abend ausprobieren. Ich habe es jetzt erstmal anders gelöst und es scheint zu funktionieren, und zwar habe ich folgenden Code verwendet:

efine Zirku_Pumpe_auto_neu DOIF ([?Abwesend:state] eq "nein" and [?Urlaub:state] eq "nein" and [Status_Warmwasser:state] eq "an")
(set Zirkulationspumpe_WW on-for-timer 600, sleep 3600;trigger Abwesend)


Das trigger Abwesend kann ich dann auch weglassen denke ich mal. Und dann habe ich dem Status_Warmwasser ein Addlog hinzugefügt, welches jede Stunde ein Event anlegt. Dadurch wird die Pumpe dann jede Stunde eingeschaltet. Kleiner Schönheitsfehler dabei, dass sie im schlimmsten Fall erst 1 Stunde nachdem Abwesend auf nein geht, anspringt, wäre jedoch zu verschmerzen.

Aber ich teste heute Abend/kommende Nacht auf jeden Fall deinen Code!

@Flurin: Besten Dank auch an dich für die Ideen!
FHEM auf QNAP per VM / HM LAN Adapter / diverse HM-Devices
QNAP TVS 463
VU+ Duo4kSE
Sony 75ZD9

Michi240281

Zitat von: Damian am 25 März 2015, 13:34:17
Mit trigger Abwesend wird ein Event für Abwesend erzeugt. Damit wird das DOIF-Modul getriggert, welches Abwesend abfragt - allerdings ohne Fragezeichenangabe.

Die Idee von Flurin mit indirekter Zeitsteuerung ist nicht schlecht. Damit kommt man ohne Sleep aus, kombiniert mit meinem letzten Vorschlag würde es so aussehen:

1. Dieses Modul soll nur den Zustand on bzw. off haben, abhängig davon ob die Pumpe zirkulieren soll oder nicht. Da kein do always gesetzt wird, ist hier egal wie oft Abwesend triggert.

define Zirku_Pumpe_auto DOIF ([Abwesend:state] eq "nein" and [Urlaub:state] eq "nein" and [Status_Warmwasser:state] eq "an")
attr zirku_Pumpe_auto state on|off


2. Jetzt wird ein Dummy für die zeitliche Wiederholung definiert (hier eine Stunde)

define Intervall dummy
set Intervall 01:00



3. Und nun wird das Haupt-DOIF für das Schalten der Pumpe definiert:

define di_Zirku_Pumpe_on DOIF ([zirku_Pumpe_auto] eq "on" or ([+[Intervall]] and [?Zirku_Pumpe_auto] eq "on") ) (set Zirkulationspumpe_WW on-for-timer 300, trigger Intervall)
attr di_Zirku_Pumpe_on do always


Damit läuft die Pumpe sofort los, wenn der Status von Zirku_Pumpe_auto auf on geht, oder wenn das Intervall von einer Stunde abläuft und der Zirkulationsmodus auf on steht. Mit trigger Intervall wird das Setzen der nächsten Schaltzeit nach einer Stunde über die Intervallzeit provoziert.

Gruß

Damian

Hallo Damian,

habe den ganzen Code bei mir eingebaut! Leider tuts das nicht! Hier ein list von allen 3 Einträgen:

Internals:
   CFGFN
   DEF        ([Abwesend:state] eq "nein" and [Urlaub:state] eq "nein" and [Status_Warmwasser:state] eq "an")
   NAME       Zirku_Pumpe_auto
   NR         6489
   NTFY_ORDER 50-Zirku_Pumpe_auto
   STATE      on|off
   TYPE       DOIF
   Readings:
     2015-03-26 20:15:06   cmd_event       Status_Warmwasser
     2015-03-26 20:15:06   cmd_nr          1
     2015-03-26 20:51:41   e_Abwesend_state nein
     2015-03-26 21:30:00   e_Status_Warmwasser_state an
     2015-03-26 20:12:34   e_Urlaub_state  nein
     2015-03-26 20:15:06   state           on|off
   Condition:
     0          ReadingValDoIf('Abwesend','state','') eq "nein" and ReadingValDoIf('Urlaub','state','') eq "nein" and ReadingValDoIf('Status_Warmwasser','state','') eq "an"
   Devices:
     0           Abwesend Urlaub Status_Warmwasser
     all         Abwesend Urlaub Status_Warmwasser
   Do:
     0
   Helper:
     last_timer 0
     sleeptimer -1
     Bm:
       Doif_attr:
         cnt        4
         dmx        0
         max        74
         tot        74
         mAr:
           set
           Zirku_Pumpe_auto
           disable
           0
       Doif_notify:
         cnt        904
         dmx        0
         max        76
         tot        368
         mAr:
           HASH(0x1293add0)
           HASH(0xf544210)
   Internals:
   Itimer:
   Readings:
     0           Abwesend:state Urlaub:state Status_Warmwasser:state
     all         Abwesend:state Urlaub:state Status_Warmwasser:state
   State:
   Timerfunc:
   Trigger:
Attributes:
   disable    0
   group      Warmwasser
   room       Garage
   state      on|off


Internals:
   CFGFN
   NAME       Intervall
   NR         6495
   STATE      01:00
   TYPE       dummy
   Readings:
     2015-03-26 20:01:11   state           01:00
   Helper:
     Bm:
       Dummy_define:
         cnt        1
         dmx        0
         mAr
         max        0
         tot        0
       Dummy_set:
         cnt        21
         dmx        0
         max        21
         tot        21
         mAr:
           HASH(0x127f8388)
           Intervall
           01:00
Attributes:
   group      Warmwasser
   room       Garage




Internals:
   CFGFN
   DEF        ([Zirku_Pumpe_auto] eq "on" or ([+[Intervall]] and [?Zirku_Pumpe_auto] eq "on") ) (set Zirkulationspumpe_WW on-for-timer 600, trigger Intervall)
   NAME       di_Zirku_Pumpe_on
   NR         6509
   NTFY_ORDER 50-di_Zirku_Pumpe_on
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2015-03-26 21:06:53   cmd_event       timer_1
     2015-03-26 21:06:53   cmd_nr          2
     2015-03-26 20:15:06   e_Zirku_Pumpe_auto_STATE on|off
     2015-03-26 21:06:53   state           cmd_2
     2015-03-26 21:06:53   timer_1_c1      26.03.2015 22:06:53
   Condition:
     0          InternalDoIf('Zirku_Pumpe_auto','STATE','') eq "on" or (DOIF_time_once($hash->{timer}{0},$wday,"") and InternalDoIf('Zirku_Pumpe_auto','STATE','') eq "on")
   Days:
   Devices:
     0           Zirku_Pumpe_auto
     all         Zirku_Pumpe_auto
   Do:
     0          set Zirkulationspumpe_WW on-for-timer 600, trigger Intervall
   Helper:
     last_timer 1
     sleeptimer -1
     Bm:
       Doif_notify:
         cnt        831
         dmx        0
         max        40
         tot        217
         mAr:
           HASH(0x129718f8)
           HASH(0x1293add0)
   Internals:
     0           Zirku_Pumpe_auto:STATE
     all         Zirku_Pumpe_auto:STATE
   Itimer:
     all         Intervall
   Readings:
   Realtime:
     0          22:06:53
   State:
   Time:
     0          +[Intervall]
   Timecond:
     0          0
   Timer:
     0          0
   Timerfunc:
   Timers:
     0           0
   Trigger:
Attributes:
   do         always
   group      Warmwasser
   room       Garage


Irgendne Idee? Was ich komisch finde, ist die Syntax bei dem State des ersten DOIFs "on|off"! Da kann ja dann die Abfrage im Haupt-DOIF garnicht wahr werden?!?

FHEM auf QNAP per VM / HM LAN Adapter / diverse HM-Devices
QNAP TVS 463
VU+ Duo4kSE
Sony 75ZD9

Damian

Zitat von: Michi240281 am 26 März 2015, 21:53:16


Irgendne Idee? Was ich komisch finde, ist die Syntax bei dem State des ersten DOIFs "on|off"! Da kann ja dann die Abfrage im Haupt-DOIF garnicht wahr werden?!?

ja, mein Fehler, es muss heißen:

attr zirku_Pumpe_auto cmdState on|off

statt

attr zirku_Pumpe_auto state on|off

(das state-Attribut musst du wieder Löschen)


Bei der Vielzahl der Attribute, weiß ich inzwischen selbst nicht mehr, was ich mir mal ausgedacht habe ;)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF