DOIF Attribute disable und Initialisierungsproblem

Begonnen von vuffiraa, 11 Mai 2015, 12:57:25

Vorheriges Thema - Nächstes Thema

vuffiraa

Hallo,

ich wollte DOIF dazu benutzen, um mir eine Urlaubsteuerung für meine Jalousien zu schreiben. Da ich nicht immer Urlaub habe :(, wollte ich die Definition dann per Attribute disable = 1 inaktiv schalten. Soweit funktioniert alles, aber wenn ich disable = 0 setzte, wird die Urlaubssteuerung nicht ausgeführt.

Zum Nachvollziehen habe ich die Definition aufs Wesentliche reduziert:
define RollosTEST DOIF ([08:25])\
  ({Log 3, "Rollos TEST"})\
DOELSEIF ([21:25])\
  ({Log 3, "Rollos TEST"})
attr RollosTEST do always


Nachdem ich das Gerät gestern mal wieder aktiviert habe, wurden folgende Readings angezeigt:
Readings
state initialized 2015-05-10 19:05:33
timer_1_c1 04.05.2015 08:25:00 2015-05-03 08:25:00
timer_2_c2 03.05.2015 21:25:00 2015-05-02 21:25:00


Was auffällt sind die timer-Readings, die in der Vergangenheit liegen, daher ist es kein Wunder, dass nichts ausgeführt wird. Auch ein nochmaliges setzen des Attributes disable ändert nichts an den timer-Readings. Wenn ich aber die Definition im Frontend neu speichere, also "modify RolloTEST" ohne Änderung, werden die Readings neu berechnet:
Readings
state initialized 2015-05-11 09:04:45
timer_1_c1 12.05.2015 08:25:00 2015-05-11 09:04:45
timer_2_c2 11.05.2015 21:25:00 2015-05-11 09:04:45


Ab jetzt funktioniert wieder alles. Ich erwarte doch aber, dass ein disable = 0 ausreicht, um die Definition wieder zu aktivieren.

Das sieht für mich nach eine Bug im DOIF aus oder?

Viele Grüße
FHEM 5.8 auf Cubietruck, Raspi B+

Weinzierl KNX IP BAOS 770, Homematic, EnOcean

Damian

Zitat von: vuffiraa am 11 Mai 2015, 12:57:25
Hallo,

ich wollte DOIF dazu benutzen, um mir eine Urlaubsteuerung für meine Jalousien zu schreiben. Da ich nicht immer Urlaub habe :(, wollte ich die Definition dann per Attribute disable = 1 inaktiv schalten. Soweit funktioniert alles, aber wenn ich disable = 0 setzte, wird die Urlaubssteuerung nicht ausgeführt.

Zum Nachvollziehen habe ich die Definition aufs Wesentliche reduziert:
define RollosTEST DOIF ([08:25])\
  ({Log 3, "Rollos TEST"})\
DOELSEIF ([21:25])\
  ({Log 3, "Rollos TEST"})
attr RollosTEST do always


Nachdem ich das Gerät gestern mal wieder aktiviert habe, wurden folgende Readings angezeigt:
Readings
state initialized 2015-05-10 19:05:33
timer_1_c1 04.05.2015 08:25:00 2015-05-03 08:25:00
timer_2_c2 03.05.2015 21:25:00 2015-05-02 21:25:00


Was auffällt sind die timer-Readings, die in der Vergangenheit liegen, daher ist es kein Wunder, dass nichts ausgeführt wird. Auch ein nochmaliges setzen des Attributes disable ändert nichts an den timer-Readings. Wenn ich aber die Definition im Frontend neu speichere, also "modify RolloTEST" ohne Änderung, werden die Readings neu berechnet:
Readings
state initialized 2015-05-11 09:04:45
timer_1_c1 12.05.2015 08:25:00 2015-05-11 09:04:45
timer_2_c2 11.05.2015 21:25:00 2015-05-11 09:04:45


Ab jetzt funktioniert wieder alles. Ich erwarte doch aber, dass ein disable = 0 ausreicht, um die Definition wieder zu aktivieren.

Das sieht für mich nach eine Bug im DOIF aus oder?

Viele Grüße

So wie es jetzt programmiert ist, sollten eigentlich die Timer weiter laufen. Das sieht dann nach einem Bug aus. Dann wollen wir mal hoffen, dass sich das Verhalten nachstellen lässt.

Gruß

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

vuffiraa

Zitat von: Damian am 11 Mai 2015, 13:16:55
So wie es jetzt programmiert ist, sollten eigentlich die Timer weiter laufen. Das sieht dann nach einem Bug aus. Dann wollen wir mal hoffen, dass sich das Verhalten nachstellen lässt.

Zu mindestens auf meinem System kann ich es gut nachstellen. Im Original und in der abgespeckten Variante, wie hier gepostet.

Gruß Ulf
FHEM 5.8 auf Cubietruck, Raspi B+

Weinzierl KNX IP BAOS 770, Homematic, EnOcean

Damian

Zitat von: vuffiraa am 11 Mai 2015, 15:40:12
Zu mindestens auf meinem System kann ich es gut nachstellen. Im Original und in der abgespeckten Variante, wie hier gepostet.

Gruß Ulf

tja, wie so oft, bei mir funktioniert alles, wie es soll:

nternals:
   CFGFN
   DEF        ([+00:01]) (set bla on) DOELSEIF([+00:00:15])(set bla off)
   NAME       di_test
   NR         4494
   NTFY_ORDER 50-di_test
   STATE      disabled
   TYPE       DOIF
   Readings:
     2015-05-11 15:56:51   cmd_event       timer_2
     2015-05-11 15:56:51   cmd_nr          2
     2015-05-11 15:56:51   error           set bla off: Please define bla first
     2015-05-11 15:57:03   state           disabled
     2015-05-11 15:57:06   timer_1_c1      11.05.2015 15:58:06
     2015-05-11 15:57:51   timer_2_c2      11.05.2015 15:58:06
   Condition:
     0          DOIF_time_once($hash->{timer}{0},$wday,"")
     1          DOIF_time_once($hash->{timer}{1},$wday,"")
   Days:
   Devices:
   Do:
     0          set bla on
     1          set bla off
   Helper:
     last_timer 2
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
   Realtime:
     0          15:58:06
     1          15:58:06
   State:
   Time:
     0          +00:01
     1          +00:00:15
   Timecond:
     0          0
     1          1
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     0           0
     1           1
Attributes:
   disable    1
   do         always


mit disable 1, disable 0 und mit gelöschtem disable wird immer die Zeit weitergeführt.

Hast du die letzte Version des Moduls?

$Id: 98_DOIF.pm 8432 2015-04-13 19:34:11Z damian-s $


Gruß

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

vuffiraa

Zitat von: Damian am 11 Mai 2015, 16:02:50
tja, wie so oft, bei mir funktioniert alles, wie es soll:

Hast du die letzte Version des Moduls?

$Id: 98_DOIF.pm 8432 2015-04-13 19:34:11Z damian-s $

Ja, genau diese Version habe ich.

Ich habe dein Beispiel mal bei mir eingefügt und es die Timer wurden aktualisiert ... erst mal ...
Du hast mich etwas ins Schwitzen gebracht, da jetzt bei allen meinen DOIF-Geräten die Timer aktualisiert wurden, egal wie disable gesetzt war.

Mein Idee war dann ein shutdown restart, dann war das beobachtete Verhalten wieder da:
Internals:
   DEF        ([+00:01])
  ({Log 3, "Rollos 00:01"})
DOELSEIF ([+00:15])
  ({Log 3, "Rollos 00:15"})
   NAME       RollosTEST2
   NR         306
   NTFY_ORDER 50-RollosTEST2
   STATE      initialized
   TYPE       DOIF
   CHANGETIME:
   Readings:
     2015-05-12 08:51:45   state           initialized
     2015-05-12 08:29:38   timer_1_c1      12.05.2015 08:30:38
     2015-05-12 08:16:38   timer_2_c2      12.05.2015 08:31:38
   Condition:
     0          DOIF_time_once($hash->{timer}{0},$wday,"")
     1          DOIF_time_once($hash->{timer}{1},$wday,"")
   Devices:
   Do:
     0          {Log 3, "Rollos 00:01"}
     1          {Log 3, "Rollos 00:15"}
   Helper:
     last_timer 2
     sleeptimer -1
   Itimer:
   State:
   Time:
     0          +00:01
     1          +00:15
   Timecond:
     0          0
     1          1
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     0           0
     1           1
Attributes:
   DbLogExclude .*
   do         always
   room       Zentral


Gruß Ulf
FHEM 5.8 auf Cubietruck, Raspi B+

Weinzierl KNX IP BAOS 770, Homematic, EnOcean

Damian

Zitat von: vuffiraa am 12 Mai 2015, 08:56:40
Ja, genau diese Version habe ich.

Ich habe dein Beispiel mal bei mir eingefügt und es die Timer wurden aktualisiert ... erst mal ...
Du hast mich etwas ins Schwitzen gebracht, da jetzt bei allen meinen DOIF-Geräten die Timer aktualisiert wurden, egal wie disable gesetzt war.

Mein Idee war dann ein shutdown restart, dann war das beobachtete Verhalten wieder da:
Internals:
   DEF        ([+00:01])
  ({Log 3, "Rollos 00:01"})
DOELSEIF ([+00:15])
  ({Log 3, "Rollos 00:15"})
   NAME       RollosTEST2
   NR         306
   NTFY_ORDER 50-RollosTEST2
   STATE      initialized
   TYPE       DOIF
   CHANGETIME:
   Readings:
     2015-05-12 08:51:45   state           initialized
     2015-05-12 08:29:38   timer_1_c1      12.05.2015 08:30:38
     2015-05-12 08:16:38   timer_2_c2      12.05.2015 08:31:38
   Condition:
     0          DOIF_time_once($hash->{timer}{0},$wday,"")
     1          DOIF_time_once($hash->{timer}{1},$wday,"")
   Devices:
   Do:
     0          {Log 3, "Rollos 00:01"}
     1          {Log 3, "Rollos 00:15"}
   Helper:
     last_timer 2
     sleeptimer -1
   Itimer:
   State:
   Time:
     0          +00:01
     1          +00:15
   Timecond:
     0          0
     1          1
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     0           0
     1           1
Attributes:
   DbLogExclude .*
   do         always
   room       Zentral


Gruß Ulf

Ok. Damit kann ich was anfangen. Mal schauen, ob ich kurzfristig etwas ändern kann. Langfrist will ich den Mechanismus ändern, dass ein Modul bei disable komplett stillgelegt wird und bei enable die Timer neuaufgesetzt werden. Es soll auch einen Befehl set disable/enable geben.

Gruß

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

flurin

Die Aufgabe lässt sich auch wie folgt lösen:


define du_holiday dummy
attr du_holiday setList on off



define RollosTEST DOIF ([08:25] and [du_holiday] eq "on")\
  ({Log 3, "Rollos TEST"})\
DOELSEIF ([21:25] and [du_holiday] eq "on")\
  ({Log 3, "Rollos TEST"})
attr RollosTEST do always


Das hat den Vorteil, dass man du_holiday im Frontend setzen und darstellen kann.

Gruss
flurin

vuffiraa


Zitat von: flurin am 12 Mai 2015, 09:42:30Das hat den Vorteil, dass man du_holiday im Frontend setzen und darstellen kann.

Gutes Argument für deine Lösung. Bisher fand ich das disable im Gerät gar nicht so schlimm, aber so kann ich es meiner Regierung auch viel besser verkaufen.

Gruß Ulf
FHEM 5.8 auf Cubietruck, Raspi B+

Weinzierl KNX IP BAOS 770, Homematic, EnOcean

Damian

Zitat von: vuffiraa am 16 Mai 2015, 13:17:41
Gutes Argument für deine Lösung. Bisher fand ich das disable im Gerät gar nicht so schlimm, aber so kann ich es meiner Regierung auch viel besser verkaufen.

Gruß Ulf

Wie schon bereits gewünscht, wird es auch ein set disable/enable geben. Das hat den Vorteil im Gegensatz zum Attribut, dass die Konfiguration nicht gespeichert werden muss nach Änderung. Auf der anderen Seite kann man auch ohne Dummys jederzeit ein Modul aktivieren bzw. deaktivieren.

Gruß

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

MarcoE

Hallo,
gibt es was neues zum enable beim DOIF? Ich habe auch das Problem, daß meine Beschattungssteuerung sich zwar disablen lässt aber eben nicht mehr enablen... oder wäre da ein initialize eine Lösung?
Hier mein Code:
zuerst das DOIF für die Beschattung

define SW_Rollo_Sommer_Beschattung DOIF (\
   [TC_Twilight:azimuth] > 110 and \
   [TC_Twilight:azimuth] < 270 and \
   [TC_Twilight:elevation] > 25 and \
   [MeinWetter:condition] =~ /sonnig|heiter|klar|heiß|teilweise wolkig|wolkig/ and \
   [MeinWetter:fc1_high_c] >= 23 and \
   [HomeStatus] eq "1"\
) (set SuedWestRollo schlitz, set fhem_marco_bot message Sonnenschutz hinten schlitz) \
DOELSEIF (\
   [TC_Twilight:azimuth] > 110 and \
   [TC_Twilight:azimuth] < 270 and \
   [TC_Twilight:elevation] > 25 and \
   [MeinWetter:condition] =~ /sonnig|heiter|klar|heiß|teilweise wolkig|wolkig/ and \
   [MeinWetter:fc1_high_c] >= 23 and \
   [HomeStatus] ne "1"\
) (set SuedWestRollo geschlossen, set fhem_marco_bot message Sonnenschutz hinten geschlossen) \
DOELSE (set SuedWestRollo offen, set fhem_marco_bot message Sonnenschutz hinten aus)


jetzt noch das disablen:

define SW_Rollos DOIF (\
   [16:00-23:00] and \
   [TC_Twilight:twilight]<61\
) (set SuedWestRollo geschlossen, set SW_Rollo_Sommer_Beschattung disable 1) \
DOELSEIF (\
   (\
      [06:00-10:00|8] or \
      [8:30-11:00|7]\
   ) and \
   [TC_Twilight:twilight] > 46\
) (set SuedWestRollo offen, set SW_Rollo_Sommer_Beschattung disable 0)


Oder wie würdet ihr das lösen?
(Die Idee ist, daß die Rolläden nachts runterfahren- abhängig von Wochentag, Uhrzeit und Twilight und die Beschattung in Abhängigkeit vom Wetter runterfährt aber nur komplett wenn niemand zuhause ist. Ist im Beschattungszustand jemand zuhause oder kommt nach Hause bitte nur auf Position Schlitz)

Danke und Gruß,
Marco

Damian

Zitat von: MarcoE am 24 Mai 2016, 12:51:42
Hallo,
gibt es was neues zum enable beim DOIF? Ich habe auch das Problem, daß meine Beschattungssteuerung sich zwar disablen lässt aber eben nicht mehr enablen... oder wäre da ein initialize eine Lösung?
Hier mein Code:
zuerst das DOIF für die Beschattung

define SW_Rollo_Sommer_Beschattung DOIF (\
   [TC_Twilight:azimuth] > 110 and \
   [TC_Twilight:azimuth] < 270 and \
   [TC_Twilight:elevation] > 25 and \
   [MeinWetter:condition] =~ /sonnig|heiter|klar|heiß|teilweise wolkig|wolkig/ and \
   [MeinWetter:fc1_high_c] >= 23 and \
   [HomeStatus] eq "1"\
) (set SuedWestRollo schlitz, set fhem_marco_bot message Sonnenschutz hinten schlitz) \
DOELSEIF (\
   [TC_Twilight:azimuth] > 110 and \
   [TC_Twilight:azimuth] < 270 and \
   [TC_Twilight:elevation] > 25 and \
   [MeinWetter:condition] =~ /sonnig|heiter|klar|heiß|teilweise wolkig|wolkig/ and \
   [MeinWetter:fc1_high_c] >= 23 and \
   [HomeStatus] ne "1"\
) (set SuedWestRollo geschlossen, set fhem_marco_bot message Sonnenschutz hinten geschlossen) \
DOELSE (set SuedWestRollo offen, set fhem_marco_bot message Sonnenschutz hinten aus)


jetzt noch das disablen:

define SW_Rollos DOIF (\
   [16:00-23:00] and \
   [TC_Twilight:twilight]<61\
) (set SuedWestRollo geschlossen, set SW_Rollo_Sommer_Beschattung disable 1) \
DOELSEIF (\
   (\
      [06:00-10:00|8] or \
      [8:30-11:00|7]\
   ) and \
   [TC_Twilight:twilight] > 46\
) (set SuedWestRollo offen, set SW_Rollo_Sommer_Beschattung disable 0)


Oder wie würdet ihr das lösen?
(Die Idee ist, daß die Rolläden nachts runterfahren- abhängig von Wochentag, Uhrzeit und Twilight und die Beschattung in Abhängigkeit vom Wetter runterfährt aber nur komplett wenn niemand zuhause ist. Ist im Beschattungszustand jemand zuhause oder kommt nach Hause bitte nur auf Position Schlitz)

Danke und Gruß,
Marco

Kurzfristiges Disablen kann man per set  ... diable realisieren, das Gegenstück ist set ... initialize.

Steht aber alles hier:

http://fhem.de/commandref_DE.html#DOIF_disable
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MarcoE

Hallo,
die commandref hatte ich schon gelesen- nur in den Posts hier in diesem Thread stand eben was von einer Weiterentwicklung mit einem enable (16.5.2015). Daher hatte ich gedacht, daß dies vielleicht besser passen würde als der initialize.

Danke und Gruss, Marco