FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: gloob am 26 Februar 2016, 09:56:55

Titel: Zeitanpassung erfolgt versetzt in DOIF
Beitrag von: gloob am 26 Februar 2016, 09:56:55
Hallo,

Ich steuere 2 Zeiten in einem DOIF über Dummys.

define Pflanzenlampe_active dummy
attr Pflanzenlampe_active room Pflanzen
attr Pflanzenlampe_active webCmd on:off

define Pflanzenlampe_time_on dummy
attr Pflanzenlampe_time_on room Pflanzen
attr Pflanzenlampe_time_on setList state:time
attr Pflanzenlampe_time_on userReadings Stunde {()},Minute {()},
attr Pflanzenlampe_time_on webCmd state

define Pflanzenlampe_time_off dummy
attr Pflanzenlampe_time_off room Pflanzen
attr Pflanzenlampe_time_off setList state:time
attr Pflanzenlampe_time_off userReadings Stunde {()},Minute {()},
attr Pflanzenlampe_time_off webCmd state

define Pflanzenlampe_doif DOIF ([[Pflanzenlampe_time_on]] and [Pflanzenlampe_active] eq "on") (set HM_WZ_Steckdose_Sw on) DOELSEIF ([[Pflanzenlampe_time_off]]) (set HM_WZ_Steckdose_Sw off)
attr Pflanzenlampe_doif do always
attr Pflanzenlampe_doif room Pflanzen


Aktuell möchte ich die Zeiten in FTUI anpassen und habe dazu eine Funktion die die Minuten und Stunden Werte im Dummy anpasst.


sub ZeitenStateStundeMinute($) {
my ($HZ1) = @_;
my $Stunde1 = ReadingsVal($HZ1,"Stunde","");
my $Minute1 = ReadingsVal($HZ1,"Minute","");
$Stunde1 = sprintf("%02d",$Stunde1);
$Minute1 = sprintf("%02d",$Minute1);
my $zeiten1 = $Stunde1.":".$Minute1;
fhem "setreading ".$HZ1." state ".$zeiten1;
}


Ändere ich die Werte in FTUI werden mir die richtigen Zeiten auch direkt im Dummy angezeigt.
Irgendwie scheinen sich aber die Werte im DOIF nicht anzukommen.

Wenn ich die Zeiten dann ein 2. mal anpasse, aktualisiert sich das DOIF allerding mit den vorhergehenden Werten.
Es gibt also immer einen Versatz.


DUMMY Time_on: 07:00
DOIF Time_on: 07:00

Anpassung der Zeit in FTUI
Dummy Time_on: 08:00
DOIF Time_on: 07:00

2. Anpassung der Zeit in FTUI
Dummy Time_on: 09:00
DOIF Time_on: 08:00


Hat jemand eine Idee woran es liegen könnte?

Titel: Antw:Zeitanpassung erfolgt versetzt in DOIF
Beitrag von: Damian am 26 Februar 2016, 10:25:06
Zitat von: gloob am 26 Februar 2016, 09:56:55
Hallo,

Ich steuere 2 Zeiten in einem DOIF über Dummys.

define Pflanzenlampe_active dummy
attr Pflanzenlampe_active room Pflanzen
attr Pflanzenlampe_active webCmd on:off

define Pflanzenlampe_time_on dummy
attr Pflanzenlampe_time_on room Pflanzen
attr Pflanzenlampe_time_on setList state:time
attr Pflanzenlampe_time_on userReadings Stunde {()},Minute {()},
attr Pflanzenlampe_time_on webCmd state

define Pflanzenlampe_time_off dummy
attr Pflanzenlampe_time_off room Pflanzen
attr Pflanzenlampe_time_off setList state:time
attr Pflanzenlampe_time_off userReadings Stunde {()},Minute {()},
attr Pflanzenlampe_time_off webCmd state

define Pflanzenlampe_doif DOIF ([[Pflanzenlampe_time_on]] and [Pflanzenlampe_active] eq "on") (set HM_WZ_Steckdose_Sw on) DOELSEIF ([[Pflanzenlampe_time_off]]) (set HM_WZ_Steckdose_Sw off)
attr Pflanzenlampe_doif do always
attr Pflanzenlampe_doif room Pflanzen


Aktuell möchte ich die Zeiten in FTUI anpassen und habe dazu eine Funktion die die Minuten und Stunden Werte im Dummy anpasst.


sub ZeitenStateStundeMinute($) {
my ($HZ1) = @_;
my $Stunde1 = ReadingsVal($HZ1,"Stunde","");
my $Minute1 = ReadingsVal($HZ1,"Minute","");
$Stunde1 = sprintf("%02d",$Stunde1);
$Minute1 = sprintf("%02d",$Minute1);
my $zeiten1 = $Stunde1.":".$Minute1;
fhem "setreading ".$HZ1." state ".$zeiten1;
}


Ändere ich die Werte in FTUI werden mir die richtigen Zeiten auch direkt im Dummy angezeigt.
Irgendwie scheinen sich aber die Werte im DOIF nicht anzukommen.

Wenn ich die Zeiten dann ein 2. mal anpasse, aktualisiert sich das DOIF allerding mit den vorhergehenden Werten.
Es gibt also immer einen Versatz.


DUMMY Time_on: 07:00
DOIF Time_on: 07:00

Anpassung der Zeit in FTUI
Dummy Time_on: 08:00
DOIF Time_on: 07:00

2. Anpassung der Zeit in FTUI
Dummy Time_on: 09:00
DOIF Time_on: 08:00


Hat jemand eine Idee woran es liegen könnte?

Der Timer wird im DOIF-Modul sofort angepasst. Das Ändern der Timer im DOIF-Modul erzeugt allerdings kein Event, daher wird die Änderung nicht sofort am Bildschirm aktualisiert. Man muss die Anzeige im Browser aktualisieren (bei Windows F5-Taste), damit man die aktuellen Angaben auch sieht. Ebenfalls kann man mit:
list <mein DOIF-Modul> in der Kommandozeile immer die aktuellen Informationen des Moduls sich anzeigen lassen.

Gruß

Damian
Titel: Antw:Zeitanpassung erfolgt versetzt in DOIF
Beitrag von: gloob am 26 Februar 2016, 11:18:40
Bei mir wird der Timer nicht angepasst. Auch wenn ich F5 drücke oder ein neues List mache.
Lediglich die Dummys werden richtig angezeigt. Beim DOIF bleiben die alten Werte noch bis zur nächsten Änderung stehen.
Titel: Antw:Zeitanpassung erfolgt versetzt in DOIF
Beitrag von: Damian am 26 Februar 2016, 11:22:37
Zitat von: gloob am 26 Februar 2016, 11:18:40
Bei mir wird der Timer nicht angepasst. Auch wenn ich F5 drücke oder ein neues List mache.
Lediglich die Dummys werden richtig angezeigt. Beim DOIF bleiben die alten Werte noch bis zur nächsten Änderung stehen.

Poste mal list von deinem Modul
Titel: Antw:Zeitanpassung erfolgt versetzt in DOIF
Beitrag von: gloob am 26 Februar 2016, 11:24:03
Hier sind die Listings der Dummys:

Internals:
   NAME       Pflanzenlampe_time_on
   NR         420
   STATE      07:00
   TYPE       dummy
   Readings:
     2016-02-26 10:19:47   Minute          0
     2016-02-26 11:21:56   Stunde          7
     2016-02-26 11:21:56   state           07:00
Attributes:
   room       Pflanzen
   setList    state:time
   userReadings Stunde {()},Minute {()},
   webCmd     state



Internals:
   NAME       Pflanzenlampe_time_off
   NR         422
   STATE      18:00
   TYPE       dummy
   Readings:
     2016-02-26 10:10:11   Minute          0
     2016-02-26 11:21:57   Stunde          18
     2016-02-26 11:21:57   state           18:00
Attributes:
   room       Pflanzen
   setList    state:time
   userReadings Stunde {()},Minute {()},
   webCmd     state


Und das Listing des DOIF

Internals:
   DEF        ([[Pflanzenlampe_time_on]] and [Pflanzenlampe_active] eq "on") (set HM_WZ_Steckdose_Sw on) DOELSEIF ([[Pflanzenlampe_time_off]]) (set HM_WZ_Steckdose_Sw off)
   NAME       Pflanzenlampe_doif
   NR         424
   NTFY_ORDER 50-Pflanzenlampe_doif
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-02-25 09:23:38   Device          Pflanzenlampe_active
     2016-02-26 07:00:00   cmd_event       timer_1
     2016-02-26 07:00:00   cmd_nr          1
     2016-02-25 09:23:38   e_Pflanzenlampe_active_STATE on
     2016-02-26 07:00:00   state           cmd_1
     2016-02-26 11:21:56   timer_1_c1      27.02.2016 06:00:00
     2016-02-26 11:21:57   timer_2_c2      26.02.2016 17:00:00
   Condition:
     0          DOIF_time_once($hash,$hash->{timer}{0},$wday,"") and InternalDoIf($hash,'Pflanzenlampe_active','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
     1          DOIF_time_once($hash,$hash->{timer}{1},$wday,"")
   Days:
   Devices:
     0           Pflanzenlampe_active
     all         Pflanzenlampe_active
   Do:
     0:
       0          set HM_WZ_Steckdose_Sw on
     1:
       0          set HM_WZ_Steckdose_Sw off
   Helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   Internals:
     0           Pflanzenlampe_active:STATE
     all         Pflanzenlampe_active:STATE
   Itimer:
     all         Pflanzenlampe_time_on Pflanzenlampe_time_off
   Localtime:
     0          1456549200
     1          1456502400
   Realtime:
     0          06:00:00
     1          17:00:00
   Regexp:
     All:
   State:
   Time:
     0          [Pflanzenlampe_time_on]
     1          [Pflanzenlampe_time_off]
   Timecond:
     0          0
     1          1
   Timer:
     0          0
     1          0
   Timers:
     0           0
     1           1
   Triggertime:
     1456502400:
       localtime  1456502400
       Hash:
     1456549200:
       localtime  1456549200
       Hash:
Attributes:
   do         always
   room       Pflanzen


Man sieht dass die Timer vom DOIF aktualisiert werden, allerdings nicht mit den aktuellen Werten aus den Dummys.
Titel: Antw:Zeitanpassung erfolgt versetzt in DOIF
Beitrag von: Damian am 26 Februar 2016, 13:13:01
Zitat von: gloob am 26 Februar 2016, 11:24:03
Hier sind die Listings der Dummys:

Internals:
   NAME       Pflanzenlampe_time_on
   NR         420
   STATE      07:00
   TYPE       dummy
   Readings:
     2016-02-26 10:19:47   Minute          0
     2016-02-26 11:21:56   Stunde          7
     2016-02-26 11:21:56   state           07:00
Attributes:
   room       Pflanzen
   setList    state:time
   userReadings Stunde {()},Minute {()},
   webCmd     state



Internals:
   NAME       Pflanzenlampe_time_off
   NR         422
   STATE      18:00
   TYPE       dummy
   Readings:
     2016-02-26 10:10:11   Minute          0
     2016-02-26 11:21:57   Stunde          18
     2016-02-26 11:21:57   state           18:00
Attributes:
   room       Pflanzen
   setList    state:time
   userReadings Stunde {()},Minute {()},
   webCmd     state


Und das Listing des DOIF

Internals:
   DEF        ([[Pflanzenlampe_time_on]] and [Pflanzenlampe_active] eq "on") (set HM_WZ_Steckdose_Sw on) DOELSEIF ([[Pflanzenlampe_time_off]]) (set HM_WZ_Steckdose_Sw off)
   NAME       Pflanzenlampe_doif
   NR         424
   NTFY_ORDER 50-Pflanzenlampe_doif
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-02-25 09:23:38   Device          Pflanzenlampe_active
     2016-02-26 07:00:00   cmd_event       timer_1
     2016-02-26 07:00:00   cmd_nr          1
     2016-02-25 09:23:38   e_Pflanzenlampe_active_STATE on
     2016-02-26 07:00:00   state           cmd_1
     2016-02-26 11:21:56   timer_1_c1      27.02.2016 06:00:00
     2016-02-26 11:21:57   timer_2_c2      26.02.2016 17:00:00
   Condition:
     0          DOIF_time_once($hash,$hash->{timer}{0},$wday,"") and InternalDoIf($hash,'Pflanzenlampe_active','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
     1          DOIF_time_once($hash,$hash->{timer}{1},$wday,"")
   Days:
   Devices:
     0           Pflanzenlampe_active
     all         Pflanzenlampe_active
   Do:
     0:
       0          set HM_WZ_Steckdose_Sw on
     1:
       0          set HM_WZ_Steckdose_Sw off
   Helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   Internals:
     0           Pflanzenlampe_active:STATE
     all         Pflanzenlampe_active:STATE
   Itimer:
     all         Pflanzenlampe_time_on Pflanzenlampe_time_off
   Localtime:
     0          1456549200
     1          1456502400
   Realtime:
     0          06:00:00
     1          17:00:00
   Regexp:
     All:
   State:
   Time:
     0          [Pflanzenlampe_time_on]
     1          [Pflanzenlampe_time_off]
   Timecond:
     0          0
     1          1
   Timer:
     0          0
     1          0
   Timers:
     0           0
     1           1
   Triggertime:
     1456502400:
       localtime  1456502400
       Hash:
     1456549200:
       localtime  1456549200
       Hash:
Attributes:
   do         always
   room       Pflanzen


Man sieht dass die Timer vom DOIF aktualisiert werden, allerdings nicht mit den aktuellen Werten aus den Dummys.

Was passiert, wenn du die entsprechenden set-Befehle per Kommandozeile absetzt?
Titel: Antw:Zeitanpassung erfolgt versetzt in DOIF
Beitrag von: gloob am 26 Februar 2016, 14:07:00
Wenn ich den SET Befehl über die Kommandozeile eingebe, dann wird das DOIF direkt aktiviert.

Gibt es einen unterschied zwischen dem Aufruf eines Kommands über die Kommandozeile und über einen FHEM Befehl aus der myUtils?
Titel: Antw:Zeitanpassung erfolgt versetzt in DOIF
Beitrag von: Damian am 26 Februar 2016, 14:24:55
Zitat von: gloob am 26 Februar 2016, 14:07:00
Wenn ich den SET Befehl über die Kommandozeile eingebe, dann wird das DOIF direkt aktiviert.

Gibt es einen unterschied zwischen dem Aufruf eines Kommands über die Kommandozeile und über einen FHEM Befehl aus der myUtils?

Offensichtlich!?

Für solche einfache Funktionalität brauchst du eigentlich keine Extra-Routinen.

Bei DOIF wäre das z. B

setreading device reading [Stunde]:[Minute]

oder wenn es formatiert werden muss:

setreading device reading {(sprintf(%02d:%02d),[Stunde],[Minute])}


Gruß

Damian