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
sagWetterIn
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
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?
Das Problem ist, wenn DOIFs verschachtelt werden. Ich muss mir da etwas überlegen.
Kannst du bitte mal die angehängte Version bei dir testen?
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
Der Test war erfolgreich der Fehler tritt nicht auf.
korrigierte Version eingecheckt :)