[Perl DOIF] set_State schreibt nicht in in das einene Device

Begonnen von Ellert, 09 August 2020, 17:10:52

Vorheriges Thema - Nächstes Thema

Ellert

Der Befehl set_State und auch set_Reading schreibt in ein anderes DOIF-Device.
Das gilt möglicherweise auch für die get_.* Befehle

Mit set SIP call ... wird eine Durchsage an einem Fritzfon gestartet.
Der SIP-Client läst den Text vom Text2Speech-Server SagEs3 in mp3 umwandeln, falls erforderlich
Die Events von SIP und ggf SagEs3 erreichen das DOIF sagWetter
In sagWetter wird state gesetzt

Die folgenden Events werden werden mit set set_test ansage erzeugt:
Zitat2020-08-09 16:58:26.164 DOIF set_test vorher
2020-08-09 16:58:26.249 SIP SIP call_state: invite
2020-08-09 16:58:26.249 SIP SIP call: **611*
2020-08-09 16:58:26.280 DOIF sagWetter nachher
2020-08-09 16:58:26.297 DOIF set_test delta_t: 0.0883359909057617
2020-08-09 16:58:26.785 SIP SIP calling
2020-08-09 16:58:26.945 SIP SIP call_state: calling **611*
2020-08-09 16:58:27.945 SIP SIP call_state: established
2020-08-09 16:58:31.918 SIP SIP call: done
2020-08-09 16:58:31.918 SIP SIP call_state: timeout
2020-08-09 16:58:31.918 SIP SIP call_success: 0
2020-08-09 16:58:31.918 SIP SIP call_time: 4
2020-08-09 16:58:31.918 SIP SIP initialized
2020-08-09 16:58:31.918 SIP SIP call_attempt: 0

Mit der folgenden Definition lässt sich das Verhalten nachstellen.
defmod set_test DOIF ansage {\
  set_State("vorher");;\
  my $t = gettimeofday();;\
  fhem("set SIP call **611* 5 !a quick brown fox jumps over a lazy dog");;\
  ## fhem_set("SIP call **611* 5 !a quick brown fox jumps over a lazy dog");;\
  $t = gettimeofday() - $t;;\
  set_State("nachher");;\
  fhem("setreading $SELF delta_t $t");;\

}
attr set_test room 0_Test


Hier das Listing:Internals:
   CFGFN     
   DEF        ansage {
  set_State("vorher");
  my $t = gettimeofday();
  fhem("set SIP call **611* 5 !a quick brown fox jumps over a lazy dog");
  ## fhem_set("SIP call **611* 5 !a quick brown fox jumps over a lazy dog");
  $t = gettimeofday() - $t;
  set_State("nachher");
  fhem("setreading $SELF delta_t $t");
}
   FUUID      5f2ff844-f33f-5a4b-6fc6-7ea7996462dfb421
   MODEL      Perl
   NAME       set_test
   NOTIFYDEV  global
   NR         468
   NTFY_ORDER 50-set_test
   STATE      vorher
   TYPE       DOIF
   VERSION    22428 2020-07-18 20:32:08
   READINGS:
     2020-08-09 16:34:11   block_ansage    executed
     2020-08-09 16:34:11   delta_t         0.131164073944092
     2020-08-09 16:19:39   mode            enabled
     2020-08-09 16:34:11   state           vorher
   Regex:
     accu:
   condition:
     0         
  set_State("vorher");
  my $t = gettimeofday();
  fhem("set SIP call **611* 5 !a quick brown fox jumps over a lazy dog");
     $t = gettimeofday() - $t;
  set_State("nachher");
  fhem("setreading set_test delta_t $t");

   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
     0          ansage
   uiTable:
Attributes:
   room       0_Test


Und hier das Listing des Gerätes in das geschrieben wird:
Internals:
   DEF        ## 1
([?06:30-12:00] and [tischWZ_di:"^cmd_1$"] and ![?$SELF:my_done] and [?$SELF:P_aktiv,"1"])
   (setreading $SELF my_done 1,
   set tts_block 1,
   {DeleteMP3(60)},
   setreading $SELF wettertxt {(WetterText())})
   (get Tagestext tt)
## 2
DOELSEIF ([Tagestext:tagestext,"none"] and [?$SELF] eq "cmd_1")
   (set SagEs3 tts {(WetterText())} [brieftxt] [Tagestext:tagestext])
## 3
DOELSEIF (![SagEs3:playing] and [?$SELF] eq "cmd_2")
   (set osmc pause,
   (set SIP call **610* 240 !{(WetterText())} [brieftxt] [Tagestext:tagestext]))
## 4
DOELSEIF ([SIP:call] eq "done" and [?$SELF] eq "cmd_3")
   (get rss_tagesschau100 ts100)
## 5
## DOELSEIF (["^rss_ts100_ni$:^playing: 0$"] and [?$SELF] eq "cmd_4")
##   (set SIP call **610* 10 !Das war die Tagesschau vom {(ReadingsTimestamp("rss_tagesschau100","Link","1900-1-1") =~ /(\d+)-(\d+)-(\d+)/;DatumText("en",$3,$2*1,$1))})
## 6
DOELSEIF (["^rss_ts100_ni$:^playing: 0$"] and [?$SELF] eq "cmd_4")
## DOELSEIF ([SIP:call] eq "done" and [?$SELF] eq "cmd_5")
   (set tts_block 0,
   set osmc play)
   FUUID      5c45f027-f33f-5a4b-cf7e-1fa6c450855ddc09
   MODEL      FHEM
   NAME       sagWetter
   NOTIFYDEV  tischWZ_di,rss_ts100_ni,SIP,SagEs3,global,Tagestext
   NR         124
   NTFY_ORDER 50-sagWetter
   STATE      nachher
   TYPE       DOIF
   VERSION    22428 2020-07-18 20:32:08
   READINGS:
     2020-08-09 16:34:18   Device          SIP
     2017-04-01 19:03:26   P_aktiv         1
     2020-08-09 15:13:23   cmd             0
     2020-08-09 16:34:18   e_SIP_call      done
     2020-08-09 16:34:13   e_SagEs3_playing 0
     2020-08-09 15:13:23   mode            enabled
     2020-08-09 12:00:00   my_done         0
     2017-10-28 10:27:18   my_once         0
     2020-08-09 16:34:11   state           nachher
     2020-08-09 15:19:37   timer_01_c01    10.08.2020 06:30:00
     2020-08-09 15:19:37   timer_02_c01    10.08.2020 12:00:00
     2020-08-09 09:20:04   wettertxt       Guten Morgen, heute, am  Sonntag, den neunten achten 2020, kurz die Wetterlage.  Am Rand umfangreicher Hochdruckgebiete über Nordeuropa dauert die Hitzewelle auch in den nächsten Tagen an. Zum Montag nimmt die Gewitterneigung in feuchterer Luft vorübergehend zu.    HITZE: Im südlichen Binnenland und in Hamburg tagsüber weiterhin starke Wärmebelastung.  Hinweis:  Aufgrund anhaltender Trockenheit herrscht vor allem zwischen Dithmarschen, Hamburg und dem Herzogtum Lauenburg eine hohe Waldbrandgefahr.  Aktuell sind draußen 22komma3 Grad bei 82 Prozent Feuchte und 1018 millibar Luftdruck. Der Wind weht mit 7 km/h und Böen blasen bis 19 Stundenkilometer aus NordNordOst.  Im Wohnzimmer sind mörderische 24komma6 Grad bei einer Luftfeuchtigkeit von 65 Prozent.
   Regex:
     accu:
     cond:
       :
         0:
         1:
         2:
         3:
         4:
           "^rss_ts100_ni$:^playing: 0$" ^rss_ts100_ni$:^playing: 0$
       SIP:
         0:
         1:
         2:
         3:
           call       ^SIP$:^call:
         4:
       SagEs3:
         0:
         1:
         2:
           playing    ^SagEs3$:^playing:
         3:
         4:
       Tagestext:
         1:
           tagestext  ^Tagestext$:^tagestext:
       tischWZ_di:
         0:
           &STATE     ^tischWZ_di$
   attr:
     wait:
       0:
         0
         1
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::EventDoIf('tischWZ_di',$hash,'^cmd_1$',1) and !::ReadingValDoIf($hash,'sagWetter','my_done') and ::ReadingValDoIf($hash,'sagWetter','P_aktiv','"1"')
     1          ::ReadingValDoIf($hash,'Tagestext','tagestext','"none"') and ::InternalDoIf($hash,'sagWetter','STATE') eq "cmd_1"
     2          !::ReadingValDoIf($hash,'SagEs3','playing') and ::InternalDoIf($hash,'sagWetter','STATE') eq "cmd_2"
     3          ::ReadingValDoIf($hash,'SIP','call') eq "done" and ::InternalDoIf($hash,'sagWetter','STATE') eq "cmd_3"
     4          ::EventDoIf('^rss_ts100_ni$',$hash,'^playing: 0$',0) and ::InternalDoIf($hash,'sagWetter','STATE') eq "cmd_4"
   days:
   do:
     0:
       0          setreading sagWetter my_done 1,    set tts_block 1,    {DeleteMP3(60)},    setreading sagWetter wettertxt {(WetterText())}
       1          get Tagestext tt
     1:
       0          set SagEs3 tts {(WetterText())} [brieftxt] [Tagestext:tagestext]
     2:
       0          set osmc pause,    (set SIP call **610* 240 !{(WetterText())} [brieftxt] [Tagestext:tagestext])
     3:
       0          get rss_tagesschau100 ts100
     4:
       0          set tts_block 0,    set osmc play
     5:
   helper:
     DEVFILTER  ^global$|^tischWZ_di$|^Tagestext$|^SIP$|^SagEs3$|^rss_ts100_ni$
     NOTIFYDEV  global|tischWZ_di|Tagestext|SIP|SagEs3|rss_ts100_ni
     event      call: done,call_state: timeout,call_success: 0,call_time: 4,initialized,call_attempt: 0
     globalinit 1
     last_timer 2
     sleeptimer -1
     triggerDev SIP
     triggerEvents:
       call: done
       call_state: timeout
       call_success: 0
       call_time: 4
       initialized
       call_attempt: 0
     triggerEventsState:
       call: done
       call_state: timeout
       call_success: 0
       call_time: 4
       state: initialized
       call_attempt: 0
   internals:
     all         sagWetter:STATE
   interval:
     0          -1
     1          0
   intervalfunc:
   localtime:
     0          1597033800
     1          1597053600
   perlblock:
   readings:
     all         Tagestext:tagestext SagEs3:playing SIP:call
   realtime:
     0          06:30:00
     1          12:00:00
   time:
     0          06:30:00
     1          12:00:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   trigger:
     all         tischWZ_di
   triggertime:
     1597033800:
       localtime  1597033800
       hash:
     1597053600:
       localtime  1597053600
       hash:
   uiTable:
Attributes:
   alias      Briefing Wetter
   group      Medien
   icon       time_note
   notexist   "0"
   readingList P_aktiv
   room       5_Sprache
   setList    P_aktiv:1,0
   wait       0,1
   webCmd     P_aktiv
   widgetOverride wait:textField-long

Damian

#1
Mit der Testdefiniton kann ich das Problem bei mir nicht nachstellen:

Internals:
   CFGFN     
   DEF        ansage {
  set_State("vorher");
  my $t = gettimeofday();
  fhem("set SIP call **611* 5 !a quick brown fox jumps over a lazy dog");
  ## fhem_set("SIP call **611* 5 !a quick brown fox jumps over a lazy dog");
  $t = gettimeofday() - $t;
  set_State("nachher");
  fhem("setreading $SELF delta_t $t");
}
   FUUID      5f302b7e-f33f-30f6-5f70-33d40aec99a6f92a
   MODEL      Perl
   NAME       set_test
   NOTIFYDEV  global
   NR         61291
   NTFY_ORDER 50-set_test
   STATE      nachher
   TYPE       DOIF
   READINGS:
     2020-08-09 19:00:21   block_ansage    executed
     2020-08-09 19:00:21   delta_t         0.0140578746795654
     2020-08-09 18:59:42   mode            enabled
     2020-08-09 19:00:21   state           nachher
   Regex:
     accu:
   condition:
     0         
  set_State("vorher");
  my $t = gettimeofday();
  fhem("set SIP call **611* 5 !a quick brown fox jumps over a lazy dog");
     $t = gettimeofday() - $t;
  set_State("nachher");
  fhem("setreading set_test delta_t $t");

   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
     0          ansage
   uiTable:
Attributes:
   room       0_Test


Offenbar gibt es in deinem System Abhängigkeiten, die diesen Bug provozieren.

Ich vermute, dass es ohne den Aufruf von

fhem("set SIP call **611* 5 !a quick brown fox jumps over a lazy dog");;\


funktioniert.

Was für ein Device ist SIP?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Das Problem ist, wenn DOIFs verschachtelt werden. Ich muss mir da etwas überlegen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#3
Kannst du bitte mal die angehängte Version bei dir testen?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

#4
ZitatWas für ein Device ist SIP?

SIP bildet ein IP-Teklefon nach und stellt für die Fritzbox eine Nebenstellle dar.
https://commandref.fhem.de/commandref_DE.html#SIP

ZitatIch vermute, dass es ohne den Aufruf von

fhem("set SIP call **611* 5 !a quick brown fox jumps over a lazy dog");;\
Ja.

Mit dieser Definition für Raw definition lässt es sich nachstellen.
defmod other_test DOIF ([du_test:data] eq "333")\
DOELSE
attr other_test group 00_Test
attr other_test room 0_Test


defmod du_test dummy
attr du_test group 00_Test
attr du_test readingList data
attr du_test room 0_Test

defmod set_test DOIF ansage {\
  set_State("vorher");;\
  fhem("set du_test data 999");;\
  set_State("nachher");;\
}\
## other_test
attr set_test group 00_Test
attr set_test room 0_Test

Damit werde ich testen.

Das falsch gesetzte Gerät lässt sich finden mit:

list state=999


Ellert

#5
Der Test war erfolgreich der Fehler tritt nicht auf.

Damian

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