Fragen zur Kombination von DOIF und RESIDENTS

Begonnen von FunkOdyssey, 22 Juni 2015, 14:33:19

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Tag miteinander,

ich benötige mal einen Tipp. Ich nutze neuerdings das RESIDENTS-Modul, um meine Zirkulationspumpe bei Abwesenheit auszuschalten. Hierbei habe ich ein kleines Problem.

([06:00-23:00] and [rgr_Residents] eq "home")
(set powerMeter1_switch on)
DOELSE
(set powerMeter1_switch off)


Das obige DOIF funktioniert soweit ganz gut. Jedoch reagiert dieser natürlich nur auf Events bzw. durch das Triggern des RESIDENTS-Moduls. Ich hatte das nun recht häufig, dass nach einem Neustart von FHEM (Rumspielerei, Updates, etc.) das DOIF auf "cmd_2" springt und somit auf "off". Die Status des RESIDENTS-Moduls ist mit "home" korrekt. Aber es wirkt sich nicht auf das DOIF aus. Auch ein "do always" hatte mir nicht geholfen.

Habt ihr eine Tipp, wie nach einem Neustart dieses DOIF die aktuellen Werte ausliest und auf das richtige "cmd" springt?

flurin

Vermutlich das bekannte Problem mit Restart.

In 98_DOIF.pm folgende Zeile "return 0 if (!$end or !$begin);" einfügen:

sub
DOIF_time($$$$$)
{
  my $ret=0;
  my ($begin,$end,$wday,$hms,$days)=@_;
  my $we=DOIF_we($wday);
+ return 0 if (!$end or !$begin);
  if ($end gt $begin) {
    if ($hms ge $begin and $hms lt $end) {
      $ret=1;
    }

FunkOdyssey

Hmm, den Code verändern fänd ich ein wenig unglücklich. Und ich wüsste auch nicht, wie mir ein "[global:?INITIALIZED]" evtl. weiterhelfen würde.

Ich frag mich, warum DOIF nicht einfach den State/Internal/Reading auslesen kann.

@Damian: Hast du einen Tipp oder einen Ansatz?

Damian

Zitat von: Funk.Odyssey am 22 Juni 2015, 20:22:25
Hmm, den Code verändern fänd ich ein wenig unglücklich. Und ich wüsste auch nicht, wie mir ein "[global:?INITIALIZED]" evtl. weiterhelfen würde.

Ich frag mich, warum DOIF nicht einfach den State/Internal/Reading auslesen kann.

@Damian: Hast du einen Tipp oder einen Ansatz?

Ich denke, ich werde im Modul einbauen, dass das Modul keine Events auswertet, bevor das System nicht hochgefahren ist.

Gruß

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

FunkOdyssey


Damian

Zitat von: Funk.Odyssey am 22 Juni 2015, 21:11:04
Cool. Klingt vielversprechend. Danke.

Teste mal die Version im Anhang, bevor ich sie einchecke.

Gruß

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

FunkOdyssey

Mach ich gerne. Aber im Moment komme ich nicht per SSH auf die Box. Ich melde mich morgen.

FunkOdyssey

#7
Ich habe die Versionen ausgetauscht und Fhem neu gestartet.

Leider springt das DOIF nach nem Neustart nicht auf den richtige Ausführungszeit, sondern verbleibt im Status "initialized".

Internals:
   CFGFN      ./FHEM/zirkulation.cfg
   DEF        ([06:00-23:00] and [rgr_Residents] eq "home")
(set powerMeter1_switch on)
DOELSE
(set powerMeter1_switch off)
   NAME       di_zirkulation
   NR         582
   NTFY_ORDER 50-di_zirkulation
   STATE      initialized
   TYPE       DOIF
   Readings:
     2015-06-23 13:13:31   state           initialized
     2015-06-23 13:15:35   timer_1_c1      24.06.2015 06:00:00
     2015-06-23 13:15:35   timer_2_c1      23.06.2015 23:00:00
   Condition:
     0          DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and InternalDoIf('rgr_Residents','STATE','') eq "home"
   Days:
   Devices:
     0           rgr_Residents
     all         rgr_Residents
   Do:
     0          set powerMeter1_switch on
     1          set powerMeter1_switch off
   Helper:
     last_timer 2
     sleeptimer -1
   Internals:
     0           rgr_Residents:STATE
     all         rgr_Residents:STATE
   Itimer:
   Realtime:
     0          06:00:00
     1          23:00:00
   State:
   Time:
     0          06:00:00
     1          23:00:00
   Timecond:
     0          0
     1          0
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     0           0  1
Attributes:
   alias      Programmierung Zirkulationspumpe
   do         always
   group      Warmwasser
   icon       time_timer
   room       Heizung


Damian

Zitat von: Funk.Odyssey am 23 Juni 2015, 13:57:59
Ich habe die Versionen ausgetauscht und Fhem neu gestartet.

Leider springt das DOIF nach nem Neustart nicht auf den richtige Ausführungszeit, sondern verbleibt im Status "initialized".

Internals:
   CFGFN      ./FHEM/zirkulation.cfg
   DEF        ([06:00-23:00] and [rgr_Residents] eq "home")
(set powerMeter1_switch on)
DOELSE
(set powerMeter1_switch off)
   NAME       di_zirkulation
   NR         582
   NTFY_ORDER 50-di_zirkulation
   STATE      initialized
   TYPE       DOIF
   Readings:
     2015-06-23 13:13:31   state           initialized
     2015-06-23 13:15:35   timer_1_c1      24.06.2015 06:00:00
     2015-06-23 13:15:35   timer_2_c1      23.06.2015 23:00:00
   Condition:
     0          DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and InternalDoIf('rgr_Residents','STATE','') eq "home"
   Days:
   Devices:
     0           rgr_Residents
     all         rgr_Residents
   Do:
     0          set powerMeter1_switch on
     1          set powerMeter1_switch off
   Helper:
     last_timer 2
     sleeptimer -1
   Internals:
     0           rgr_Residents:STATE
     all         rgr_Residents:STATE
   Itimer:
   Realtime:
     0          06:00:00
     1          23:00:00
   State:
   Time:
     0          06:00:00
     1          23:00:00
   Timecond:
     0          0
     1          0
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     0           0  1
Attributes:
   alias      Programmierung Zirkulationspumpe
   do         always
   group      Warmwasser
   icon       time_timer
   room       Heizung


ist doch ok. getriggert wird um 06:00 Uhr und um 23:00 Uhr oder wenn rgr_Residents sich meldet, das war bis dato nicht der Fall.

Gruß

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

FunkOdyssey

Ich hatte das so verstanden, dass du etwas anderes ändern wolltest.

Zwar wird um 06:00 Uhr, 23:00 Uhr und beim Event in rgr_Residents getriggert. Aber wenn ich FHEM neu starte oder das DOIF verändere, dann verbleibt das DOIF auf Status "initialized". Ich dachte, dass du das so ändern würdest, dass beim Speichern des DEFs sich das DOIF den Status von rgr_Residents holt. So dass es eine Art und in den gewünschten Ausführungsteil springt.

Der Status von rgr_Residents ist ja weiterhin "home".
Speichere ich das DEF ab, so sollte evtl. das DOIF prüfen, wie der Status von rgr_Residents ist.
So eine Art Initial-Trigger oder wie man das nennen soll.  :-)


Damian

Zitat von: Funk.Odyssey am 23 Juni 2015, 20:18:44
Ich hatte das so verstanden, dass du etwas anderes ändern wolltest.

Zwar wird um 06:00 Uhr, 23:00 Uhr und beim Event in rgr_Residents getriggert. Aber wenn ich FHEM neu starte oder das DOIF verändere, dann verbleibt das DOIF auf Status "initialized". Ich dachte, dass du das so ändern würdest, dass beim Speichern des DEFs sich das DOIF den Status von rgr_Residents holt. So dass es eine Art und in den gewünschten Ausführungsteil springt.

Der Status von rgr_Residents ist ja weiterhin "home".
Speichere ich das DEF ab, so sollte evtl. das DOIF prüfen, wie der Status von rgr_Residents ist.
So eine Art Initial-Trigger oder wie man das nennen soll.  :-)

Also, wenn dein Modul einen bestimmten Status erlangt z. B. cmd_1, dann sollte dieser Status auch nach dem Hochfahren so bleiben, das war bisher so und sollte weiterhin so sein. Initialized kommt immer dann, wenn du über die Weboberfläche etwas an der Definition des Moduls änderst oder beim Hochfahren, wenn du es per Attribut initialize bewusst definierst. Das Modul merkt sich keine Zustände von irgendwelchen Devices, weil es die eigentlich gar nicht kennt. Das Auswerten von Zuständen wird Perl zur Laufzeit überlassen.

Gruß

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