Hallo,
ich hab ein Problem und ich komme nicht drauf. Ich möchte meine Morgenroutine mit einem DOIF lösen. Ich weiß es gibt auch andere Wege, aber es muss doch auch mit einem DOIF gehen ?
Mein DOIF sieht so aus:
define morgen_routine DOIF
(([TabletNexus:nextAlarmTime]+300))
(
set keymatic_wohnung unlock,
IF ([wetterstation_regen] eq "nein")
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet nicht. Hier kommt dein Lieblingsradiosender.)
ELSE
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet. Hier kommt dein Lieblingsradiosender.),
set TabletNexus sendIntent org.smblott.intentradio.PLAY url http://mp3ad.radioprimavera.c.nmdn.net/fs_radioprimavera/livestream.mp3 name RadioPrimavera
)
Im Reading von DOIF steht nun aber immer folgendes:
e_TabletNexus_nextAlarmTime
Mein genaues List sieht so aus:
Internals:
DEF (([TabletNexus:nextAlarmTime]+300))
(
set keymatic_wohnung unlock,
IF ([wetterstation_regen] eq "nein")
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet nicht. Hier kommt dein Lieblingsradiosender.)
ELSE
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet. Hier kommt dein Lieblingsradiosender.),
set TabletNexus sendIntent org.smblott.intentradio.PLAY url http://mp3ad.radioprimavera.c.nmdn.net/fs_radioprimavera/livestream.mp3 name RadioPrimavera
)
NAME morgen_routine
NR 466
NTFY_ORDER 50-morgen_routine
STATE cmd_1
TYPE DOIF
Readings:
2016-11-20 17:24:15 Device TabletNexus
2016-11-20 17:15:44 cmd 1
2016-11-20 17:15:44 cmd_event TabletNexus
2016-11-20 17:15:44 cmd_nr 1
2016-11-20 17:24:15 e_TabletNexus_nextAlarmTime off
2016-11-20 17:15:44 state cmd_1
Condition:
0 (ReadingValDoIf($hash,'TabletNexus','nextAlarmTime','','',AttrVal($hash->{NAME},'notexist',undef))+300)
Devices:
0 TabletNexus
all TabletNexus
Do:
0:
0 set keymatic_wohnung unlock, IF ([wetterstation_regen] eq "nein") (set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet nicht. Hier kommt dein Lieblingsradiosender.) ELSE (set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet. Hier kommt dein Lieblingsradiosender.), set TabletNexus sendIntent org.smblott.intentradio.PLAY url http://mp3ad.radioprimavera.c.nmdn.net/fs_radioprimavera/livestream.mp3 name RadioPrimavera
Helper:
event flow_SetCommands: aktiv,checkActiveTask: 0,deviceState: online,flowsetVersionAtDevice: 2.6.4,lastStatusRequestState: statusRequest_done
globalinit 1
last_timer 0
sleeptimer -1
timerdev TabletNexus
timerevent flow_SetCommands: aktiv,checkActiveTask: 0,deviceState: online,flowsetVersionAtDevice: 2.6.4,lastStatusRequestState: statusRequest_done
triggerDev TabletNexus
timerevents:
flow_SetCommands: aktiv
checkActiveTask: 0
deviceState: online
flowsetVersionAtDevice: 2.6.4
lastStatusRequestState: statusRequest_done
timereventsState:
flow_SetCommands: aktiv
checkActiveTask: 0
deviceState: online
flowsetVersionAtDevice: 2.6.4
lastStatusRequestState: statusRequest_done
triggerEvents:
flow_SetCommands: aktiv
checkActiveTask: 0
deviceState: online
flowsetVersionAtDevice: 2.6.4
lastStatusRequestState: statusRequest_done
triggerEventsState:
flow_SetCommands: aktiv
checkActiveTask: 0
deviceState: online
flowsetVersionAtDevice: 2.6.4
lastStatusRequestState: statusRequest_done
Internals:
Itimer:
Readings:
0 TabletNexus:nextAlarmTime
all TabletNexus:nextAlarmTime
Regexp:
0:
All:
State:
Trigger:
Attributes:
room Schlafzimmer
Weiß jemand was da falsch sein kann ?
Warum er auch das Reading nicht sauber auslesen kann ?
Weil sowie ich das DOIF "scharf" schalte, fängt er sofort was an zu machen. Soll er ja eigentlich nicht, weil noch gar keine Weckzeit eingetragen ist.
Ich hab es auch schon so versucht:
(([TabletNexus:nextAlarmTime]+300) and [?TabletNexus:nextAlarmTime] ne "off")
und auch ein do allways eingetragen. Alles führt dann meistens zu einer Endlosschleife.
Ich bin ein bisschen am verzweifeln.
Wo liegt da der Hund begraben ?
Das Problem ist ja auch, wenn ich z.B. Abends über das Tablet den Wecker stelle, dann ist ja die Weckzeit auch in FHEM. Dann klingelt der Wecker um 7 Uhr. Da drücke ich dann im Tablet auf "Aus". Sofort steht ja dann im Reading OFF. Erst 5 Minunten später soll er was machen.
Irgendwie sieht mein Reading jetzt aber nur so mit diesem e_ usw. aus.
Grüße,
Visionsurfer
([([TabletNexus:nextAlarmTime]+300)])
Hi,
das hatte ich schon probiert. Da kommt eine Fehlermeldung:
DOIF: Wrong timespec off: either HH:MM:SS or {perlcode}: ([TabletNexus:nextAlarmTime]+300)
So wie es oben steht, kommt die Fehlermeldung nicht.
Mein Reading war meiner Meinung auch schon mal richtig. Ich hab auch schon "shutdown restart" ausgeführt. Aber hilft alles nichts.
Grüße,
Visionsurfer
Hier steht, was falsch ist "Wrong timespec off" hast Du das überlesen?
Hi,
ne tut mir leid. Hab ich natürlich nicht überlesen. Ich kann damit nur nichts direkt anfangen.
Ich hatte es vorher so probiert:
([([TabletNexus:nextAlarmTime]+[00:05])])
Funktionierte aber auch nicht. Daher sagt mir die Fehlermeldung nicht wirklich was.
Wenn ich das DOIF so lasse wie oben, startet immer sofort wenn das DOIF initialisiert ist. Obwohl ja noch keine Weckzeit über AMAD gesetzt ist. Türschloss geht sofort auf und Ansage, sowie Radio startet sofort. Er wartet gar nicht erst auf die Weckzeit.
Ich weiß nicht was ich da verbockt habe.
Grüße,
Visionsurfer
off ist keine Zeitangabe. In TabletNexus:nextAlarmTime darf nicht off stehen, sondern es dürfen nur Zeiten enthalten sein.
Das Reading e_... ist DOIF intern und o.k.
So wie Du den Timer angibst interpretiert DOIF ihn als relative Zeitangabe ([+300]), das wird alle 5 min ausgeführt.
Versuch mal ([TabletNexus:nextAlarmTime] ne "off" and [([TabletNexus:nextAlarmTime]+300)])
die Fehlermeldung wird bleiben, aber es könnte funktionieren.
oh ok. Tausend Dank. Jetzt leuchtet mir das sofort ein und klar, dann kapier ich auch die Fehlermeldung.
Stimmt, wenn auf meinem Tablet kein Wecker gestellt ist, steht im AMAD im Reading "nextAlarmTime" = off
Mich wunder nur das ich keine Fehlermeldung bekommen habe, als ich das hier eingefügt habe:
(([TabletNexus:nextAlarmTime]+300))
Gibt es eine Möglichkeit das trotzdem hinzubekommen ?
Ich würde jetzt wieder an sowas hier denken:
(([TabletNexus:nextAlarmTime]+300) and [?TabletNexus:nextAlarmTime] ne "off")
Aber eigentlich ist es ja nicht AND. Könnte es mit einem OR gehen ? Wobei dann startet das DOIF vielleicht auch, weil er ja ein OFF erkennt.
Ich denke das Ziel ist klar ? Ich möchte einfach das er jeden Morgen zu einer vorher eingestellten Weckzeit, verschiedene Dinge macht. Ein bisschen Zeitverzögert. Also nach dem der Wecker auf dem Tablet geklingelt hat.
Krieg ich mein Problem irgendwie gelöst ?
Mit einer Fixtime über Dummy funktioniert es super. Aber ich möchte ja keine Fixtime über ein Dummy nutzen, sondern meine gestellte Weckzeit auf dem Tablet. Oder muss ich erst mal mit einem Dummy das Reading vom Tablet auslesen und dann dem DOIF übergeben ?
Puh, mir raucht der Kopf.
Grüße,
Visionsurfer
Zitat von: visionsurfer am 20 November 2016, 18:38:38
Ich würde jetzt wieder an sowas hier denken:
(([TabletNexus:nextAlarmTime]+300) and [?TabletNexus:nextAlarmTime] ne "off")
Aber eigentlich ist es ja nicht AND. Könnte es mit einem OR gehen ? Wobei dann startet das DOIF vielleicht auch, weil er ja ein OFF erkennt.
Ich denke das Ziel ist klar ? Ich möchte einfach das er jeden Morgen zu einer vorher eingestellten Weckzeit, verschiedene Dinge macht. Ein bisschen Zeitverzögert. Also nach dem der Wecker auf dem Tablet geklingelt hat.
Krieg ich mein Problem irgendwie gelöst ?
Mit einer Fixtime über Dummy funktioniert es super. Aber ich möchte ja keine Fixtime über ein Dummy nutzen, sondern meine gestellte Weckzeit auf dem Tablet. Oder muss ich erst mal mit einem Dummy das Reading vom Tablet auslesen und dann dem DOIF übergeben ?
Puh, mir raucht der Kopf.
Grüße,
Visionsurfer
Du würdest an sowas denken? Ist der Code nicht von jemandem übernommen ;)
Zum AND:
Es muss ein and sein, Du willst nämlich das die Weckerzeit nur addiert wird, wenn eben nicht "off" im reading steht. Sonst versucht er nämlich off +300 zu rechnen, was zu einem Fehler führt.
Ich hab es übrigens grad getestet und das funktioniert:
([([TabletNexus:nextAlarmTime]+[00:05])] and [?TabletNexus:nextAlarmTime] ne "off")
Damit sparst dir auch den Dummy, den Du haben wolltest beim AMAD Thread.
Versuchs mal mit
define Test DOIF ([TabletNexus:nextAlarmTime] ne "off") (set <deindoifwasdiezeitauswertet> enable) (setreading TabletNexus nextAlarmTime2 [TabletNexus:nextAlarmTime]) DOELSE (set <deindoifwasdiezeitauswertet> disable)
attr Test do always
attr Test wait 0,1:0
Damit erhält du ein neues reading bei deinem Tablet, welches nur geändert wird wenn sich die Zeit vom Wecker ändert.
Vorher wird dein doif, welches den Wecker auswertet und schon vorhanden ist, aktiv geschaltet.
Wenn jetzt off im Wecker steht, ändert sich das neue reading nicht, aber dein doif, welches den Wecker auswertet und schon vorhanden ist, wird inaktiv geschaltet.
Hi,
ok, vielen Dank. Werde ich alles ausprobieren.
@Ma_Bo
In meinem DOIF welches schon vorhanden ist und meine Weckzeit auswertet, muss ich aber dann das Reading auf "nextAlarmTime2" ändern, oder ?
Grüße,
Visionsurfer
Ja
@AmunRe
Also der Code von dir geht schon mal nicht. Es kommt halt wieder die Fehlermeldung:
DOIF: Wrong timespec off: either HH:MM:SS or {perlcode}: ([TabletNexus:nextAlarmTime]+[00:02])
Klar, weil halt das Reading off enthält. Erst wenn ich den Wecker stelle, steht dort ja ein Wert drin.
Grüße,
Visionsurfer
Zitat von: visionsurfer am 20 November 2016, 21:03:02
@AmunRe
Also der Code von dir geht schon mal nicht. Es kommt halt wieder die Fehlermeldung:
DOIF: Wrong timespec off: either HH:MM:SS or {perlcode}: ([TabletNexus:nextAlarmTime]+[00:02])
Klar, weil halt das Reading off enthält. Erst wenn ich den Wecker stelle, steht dort ja ein Wert drin.
Grüße,
Visionsurfer
Deswegen ja auch so:
([([TabletNexus:nextAlarmTime]+[00:05])] and [?TabletNexus:nextAlarmTime] ne "off")
Das funktioniert, ich hab es hier ausprobiert bevor ich es gepostet hab. Und wenn das Reading off enthält, geht er da nicht rein. darum ja
ne "off"
Weil wenn es off hat, ist die Bedingung nicht erfüllt.
okay stimmt. Ich kann das DOIF nur einschalten wenn ein wert drin steht.
Aber zum definieren kannst ja mal eben einen reinstellen. Er zeigt zwar wenn Du off drin stehen hast danach nen Fehler an, aber sowie du wieder stellst, erkennt er es und führt es auch aus.
Hi,
ne geht nicht. Ich hab exakt deinen Code ausgewählt. Es kommt immer die Fehlermeldung.
Kann es sein das du es ausprobiert hast und eine Alarmzeit gesetzt war ?
Bei mir ist gerade keine Alarmzeit gesetzt. Es steht also aktuell im Reading "off".
Ich kann deine Code nicht einfügen. Wenn ich die DEF dann speichern will, kommt die schon gerade erwähnt Fehlermeldung.
Grüße,
Visionsurfer
Zitat von: visionsurfer am 20 November 2016, 21:10:42
Hi,
ne geht nicht. Ich hab exakt deinen Code ausgewählt. Es kommt immer die Fehlermeldung.
Kann es sein das du es ausprobiert hast und eine Alarmzeit gesetzt war ?
Bei mir ist gerade keine Alarmzeit gesetzt. Es steht also aktuell im Reading "off".
Ich kann deine Code nicht einfügen. Wenn ich die DEF dann speichern will, kommt die schon gerade erwähnt Fehlermeldung.
Grüße,
Visionsurfer
Zitatokay stimmt. Ich kann das DOIF nur einschalten wenn ein wert drin steht.
Aber zum definieren kannst ja mal eben einen reinstellen. Er zeigt zwar wenn Du off drin stehen hast danach nen Fehler an, aber sowie du wieder stellst, erkennt er es und führt es auch aus.
Alternativ, musst halt erst ein doif überprüfen lassen ob eine weckzeit drin steht, wenn ja mache weiter, wenn nicht breche ab. Also setzt dir dann halt eine zweite weckzeit wie oben beschrieben. falls dich der Error stört, wenn es inaktiv ist.
Also, wenn ich erst im Reading eine Weckzeit stehen habe, dann kann ich es speichern. Grundsätzlich stört mich der Fehler nicht.
Ich hab also erst mal eine Weckzeit eingetragen. Dann deinen Code gespeichert. Danach Weckzeit wieder off und sauber eine neue Weckzeit über das Tablet gespeichert.
Das DOIF wurde dann auch richtig initalisiert. Es stand der Timer drin. Also Weckzeit +2 Minunten.
Mein Wecker auf dem Tablet hat brav um 21.30 geklingelt und 2 Minuten später ist das DOIF auf cmd2 umgesprungen. Aber es ist dann NICHTS passiert. Also keine Tür auf, keine Sprachausgabe und kein Radio.
Mein DOIF sieht nun so aus:
([([TabletNexus:nextAlarmTime]+[00:02])] and [?TabletNexus:nextAlarmTime] ne "off")
(
set keymatic_wohnung unlock,
IF ([wetterstation_regen] eq "nein")
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet nicht. Hier kommt dein Lieblingsradiosender.)
ELSE
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet. Hier kommt dein Lieblingsradiosender.),
set TabletNexus sendIntent org.smblott.intentradio.PLAY url http://mp3ad.radioprimavera.c.nmdn.net/fs_radioprimavera/livestream.mp3 name RadioPrimavera
)
Puh erstes Problem behoben, aber nun geht der Rest nicht mehr. Komisch, weil das ging ja eigentlich vorher.
Hi,
also ich bin wahrscheinlich wirklich zu blöd dafür oder irgendwo ist noch ein Fehler drin, welchen ich nicht sehen kann.
Ich habe wie von @Ma_Bo nun mal probiert den Zwischenschritt zu machen.
Also folgendes definiert:
define wecker_uebergabe DOIF ([TabletNexus:nextAlarmTime] ne "off") (set morgen_routine enable) (setreading TabletNexus nextAlarmTime2 [TabletNexus:nextAlarmTime]) DOELSE (set morgen_routine disable)
Meine Definition von dem DOIF, welches die Weckzeit auswertet sieht wie folgt aus:
([([TabletNexus:nextAlarmTime2]+[00:01])])
(
set keymatic_wohnung unlock,
IF ([wetterstation_regen] eq "nein")
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet nicht. Hier kommt dein Lieblingsradiosender.)
ELSE
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet. Hier kommt dein Lieblingsradiosender.),
set TabletNexus sendIntent org.smblott.intentradio.PLAY url http://mp3ad.radioprimavera.c.nmdn.net/fs_radioprimavera/livestream.mp3 name RadioPrimavera
)
Leider klappt es aber nicht. Der Wecker auf dem Tablet klingelt. Ich stelle ihn aus und normal soll ja 1 Minute (ist jetzt mal ein Beispielwert von mir) etwas passiert.
Es passiert aber nichts. Weil ja meiner Meinung nach das DOIF morgen_routine schon wieder disable geschaltet wird. Schließlich geht das Reading vom Tablet ja sofort, wenn ich den Wecker ausschalte wieder in off.
Sorry, oder ich stelle ich echt zu dumm an.
Grüße,
Visionsurfer
Stimmt, dann nimm bei meinem vorgeschlagenen doif ein wait von 0,1:600
Dann schaltet er dein doif erst 600 Sekunden nach dem dein Wecker off geht auf disable.
Die zeit kannst du ja ändern wie du es brauchst.
Hi,
ok. Das sieht gut aus. Scheint zu funktionieren.
Wenn ich jetzt in mein DOIF, welches meinen Wecker auswertet, das Radio 10 Minuten spielen lassen will und da auch ein wait 600 einbaue, muss ich halt dein DOIF entsprechend von der Zeit nach oben setzen, richtig ?
Oder wird das wait in meinem DOIF auch ausgeführt, wenn das DOIF schon disable gesetzt wird ? Ich glaube nicht oder ?
Wenn ich also einfüge "set radio off" und mache das erst mit einem wait 600, nach 10 Minuten, dann muss solange das DOIF auch aktiv sein, oder ?
Grüße,
Visionsurfer
Ja, das musst du auch hoch setzen.
Guten Morgen,
Leider hat die erste Weckroutine nicht geklappt. Gestern bei den Tests wunderbar. Aber da war das DOIF auch immer frisch initialisiert. Gestern nach dem letzten Test, stand dann mein DOIF, welches die Weckzeiten auswertet auf cmd_1. Heute früh hat der Wecker geklingelt, das DOIF wurde auch aktiviert, aber der Status hat sich nicht geändert. Es ist auf cmd_1 stehen geblieben.
Da ist noch irgendwas falsch, oder ?
Grüße
Visionsurfer
Zitat von: visionsurfer am 21 November 2016, 07:06:58
Guten Morgen,
Leider hat die erste Weckroutine nicht geklappt. Gestern bei den Tests wunderbar. Aber da war das DOIF auch immer frisch initialisiert. Gestern nach dem letzten Test, stand dann mein DOIF, welches die Weckzeiten auswertet auf cmd_1. Heute früh hat der Wecker geklingelt, das DOIF wurde auch aktiviert, aber der Status hat sich nicht geändert. Es ist auf cmd_1 stehen geblieben.
Da ist noch irgendwas falsch, oder ?
Grüße
Visionsurfer
Das liegt daran, das wenn ein DOIF schon ausgeführt wurde, die selbe Bedingung nicht noch mal ausgeführt wird. dafür braucht man dann "do always"
Moin,
ok, also hänge ich da einfach do always dran und dann sollte es gehen ?
Das wäre einfach :)
Grüße,
Visionsurfer
Zitat von: visionsurfer am 21 November 2016, 08:29:43
Moin,
ok, also hänge ich da einfach do always dran und dann sollte es gehen ?
Das wäre einfach :)
Grüße,
Visionsurfer
Wenn Du dafür sorgst, das es nicht in einer Endlosschleife ausgeführt wird, dann ja.
Ich habe es ja so gemacht, wie durch @Ma_Bo beschrieben.
Ich lasse das 2. Reading erstellen und dann mein DOIF, welches die Weckzeit auswertet aktiv und inaktiv schalten.
Ist das der richtige Weg ? Oder bekomme ich dadurch wieder einen Endlosschleife ?
Grüße,
Visionsurfer
ZitatVersuchs mal mit
Code: [Auswählen]
define Test DOIF ([TabletNexus:nextAlarmTime] ne "off") (set <deindoifwasdiezeitauswertet> enable) (setreading TabletNexus nextAlarmTime2 [TabletNexus:nextAlarmTime]) DOELSE (set <deindoifwasdiezeitauswertet> disable)
attr Test do always
attr Test wait 0,1:0
Damit erhält du ein neues reading bei deinem Tablet, welches nur geändert wird wenn sich die Zeit vom Wecker ändert.
Vorher wird dein doif, welches den Wecker auswertet und schon vorhanden ist, aktiv geschaltet.
Wenn jetzt off im Wecker steht, ändert sich das neue reading nicht, aber dein doif, welches den Wecker auswertet und schon vorhanden ist, wird inaktiv geschaltet.
Da steht doch alles, du brauchst halt nur die wait zeit für dich anzupassen z.B. 600 oder höher.
Du bekommst keine Endlosschleife durch das DOIF, lies dir bitte auch mal die commandref zu DOIF durch, da steht das mit Beispielen sehr gut beschrieben, wann was passiert.
Grüße Marcel
#####EDIT1
setze bitte auch das
attr <DOIFNAME> checkReadingEvent 1
damit reagiert das DOIF auch nur auf Änderungen des Readings nextAlarmTime vom device TabletNexus, andernfalls würde bei jeder Änderung eines Readings von TabletNexus, überprüft werden, ob das Reading nextAlarmTime noch den Kriterien des DOIF entspricht.
Hi,
@Ma_Bo
Ich hatte "dein" DOIF so angelegt. Auch mit den attr.
Trotzdem funktionierte es heute früh nicht. Wecker klingelte, 5 Minuten später hatte mein DOIF, welches den Wecker abarbeitet ausgeführt werden sollen. Passierte aber nichts.
Ich teste es gerade wieder.
Wie von @AmunRe geschrieben, haben wir dann nun noch in "meinem" DOIF ein do always angefügt.
Meintest du das dieser Code an "dein" oder "mein" DOIF muss ?
attr <DOIFNAME> checkReadingEvent 1
Grüße,
Visionsurfer
Kannst du bei beiden machen...
und ja das attr do always muss bei beiden doif als attr angegeben werden.
do always muss bei doif welches mit zeit gesteuert wird, immer angegeben werden, siehe commandref.
Grüße Marcel
Zitat von: visionsurfer am 20 November 2016, 17:29:58
Hallo,
ich hab ein Problem und ich komme nicht drauf. Ich möchte meine Morgenroutine mit einem DOIF lösen. Ich weiß es gibt auch andere Wege, aber es muss doch auch mit einem DOIF gehen ?
Mein DOIF sieht so aus:
define morgen_routine DOIF
(([TabletNexus:nextAlarmTime]+300))
(
set keymatic_wohnung unlock,
IF ([wetterstation_regen] eq "nein")
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet nicht. Hier kommt dein Lieblingsradiosender.)
ELSE
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet. Hier kommt dein Lieblingsradiosender.),
set TabletNexus sendIntent org.smblott.intentradio.PLAY url http://mp3ad.radioprimavera.c.nmdn.net/fs_radioprimavera/livestream.mp3 name RadioPrimavera
)
Im Reading von DOIF steht nun aber immer folgendes:
e_TabletNexus_nextAlarmTime
Mein genaues List sieht so aus:
Internals:
DEF (([TabletNexus:nextAlarmTime]+300))
(
set keymatic_wohnung unlock,
IF ([wetterstation_regen] eq "nein")
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet nicht. Hier kommt dein Lieblingsradiosender.)
ELSE
(set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet. Hier kommt dein Lieblingsradiosender.),
set TabletNexus sendIntent org.smblott.intentradio.PLAY url http://mp3ad.radioprimavera.c.nmdn.net/fs_radioprimavera/livestream.mp3 name RadioPrimavera
)
NAME morgen_routine
NR 466
NTFY_ORDER 50-morgen_routine
STATE cmd_1
TYPE DOIF
Readings:
2016-11-20 17:24:15 Device TabletNexus
2016-11-20 17:15:44 cmd 1
2016-11-20 17:15:44 cmd_event TabletNexus
2016-11-20 17:15:44 cmd_nr 1
2016-11-20 17:24:15 e_TabletNexus_nextAlarmTime off
2016-11-20 17:15:44 state cmd_1
Condition:
0 (ReadingValDoIf($hash,'TabletNexus','nextAlarmTime','','',AttrVal($hash->{NAME},'notexist',undef))+300)
Devices:
0 TabletNexus
all TabletNexus
Do:
0:
0 set keymatic_wohnung unlock, IF ([wetterstation_regen] eq "nein") (set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet nicht. Hier kommt dein Lieblingsradiosender.) ELSE (set TabletNexus ttsMsg Guten Morgen. Die aktuelle Aussentemperatur ist [wetterstation_temp:state:d] Grad und es regnet. Hier kommt dein Lieblingsradiosender.), set TabletNexus sendIntent org.smblott.intentradio.PLAY url http://mp3ad.radioprimavera.c.nmdn.net/fs_radioprimavera/livestream.mp3 name RadioPrimavera
Helper:
event flow_SetCommands: aktiv,checkActiveTask: 0,deviceState: online,flowsetVersionAtDevice: 2.6.4,lastStatusRequestState: statusRequest_done
globalinit 1
last_timer 0
sleeptimer -1
timerdev TabletNexus
timerevent flow_SetCommands: aktiv,checkActiveTask: 0,deviceState: online,flowsetVersionAtDevice: 2.6.4,lastStatusRequestState: statusRequest_done
triggerDev TabletNexus
timerevents:
flow_SetCommands: aktiv
checkActiveTask: 0
deviceState: online
flowsetVersionAtDevice: 2.6.4
lastStatusRequestState: statusRequest_done
timereventsState:
flow_SetCommands: aktiv
checkActiveTask: 0
deviceState: online
flowsetVersionAtDevice: 2.6.4
lastStatusRequestState: statusRequest_done
triggerEvents:
flow_SetCommands: aktiv
checkActiveTask: 0
deviceState: online
flowsetVersionAtDevice: 2.6.4
lastStatusRequestState: statusRequest_done
triggerEventsState:
flow_SetCommands: aktiv
checkActiveTask: 0
deviceState: online
flowsetVersionAtDevice: 2.6.4
lastStatusRequestState: statusRequest_done
Internals:
Itimer:
Readings:
0 TabletNexus:nextAlarmTime
all TabletNexus:nextAlarmTime
Regexp:
0:
All:
State:
Trigger:
Attributes:
room Schlafzimmer
Weiß jemand was da falsch sein kann ?
Warum er auch das Reading nicht sauber auslesen kann ?
Weil sowie ich das DOIF "scharf" schalte, fängt er sofort was an zu machen. Soll er ja eigentlich nicht, weil noch gar keine Weckzeit eingetragen ist.
Ich hab es auch schon so versucht:
(([TabletNexus:nextAlarmTime]+300) and [?TabletNexus:nextAlarmTime] ne "off")
und auch ein do allways eingetragen. Alles führt dann meistens zu einer Endlosschleife.
Ich bin ein bisschen am verzweifeln.
Wo liegt da der Hund begraben ?
Das Problem ist ja auch, wenn ich z.B. Abends über das Tablet den Wecker stelle, dann ist ja die Weckzeit auch in FHEM. Dann klingelt der Wecker um 7 Uhr. Da drücke ich dann im Tablet auf "Aus". Sofort steht ja dann im Reading OFF. Erst 5 Minunten später soll er was machen.
Irgendwie sieht mein Reading jetzt aber nur so mit diesem e_ usw. aus.
Grüße,
Visionsurfer
In Deinem ursprünglichen DOIF müsstest Du
([TabletNexus:nextAlarmTime] ne "off")
DOELSEIF ([[TabletNexus:nextAlarmTime:"(\d\d:\d\d)(:?\d?\d?)":$1 ? $1 + 300 : time + 300]]) (Deinen Kram)
schreiben dann wird "off" durch die aktuelle Zeit plus 300 s ersetzt und Du benötigst das DOIF zum disabeln nicht, da DOIF den Zustand wechselt wenn eine neue Zeit gesetzt wird.
Moin,
also grundsätzlich funktioniert das alles so von @Ma_Bo beschrieben. Ich mache das halt über "sein" DOIF und über "mein" DOIF.
Gestern Abend hab ich das ganze 3-4 mal getestet. Immer eine Weckzeit gestellt und gewartet, bis alles durchgelaufen ist. Hat alles wunderbar geklappt.
Heute morgen wieder das böse erwachen :)
Wecker auf dem Tablet hat geklingelt. 5 Minuten später kam auch "Guten Morgen....." und das Radio ist gestartet.
ABER...mein Türschloss hat nicht geöffnet. Keine Ahnung, warum er das übersprungen ist. Ich werde es heute Abend noch mal schauen. Vielleicht hat er sich einfach verschluckt.
Weil lief gestern Abend alles super.
Heute früh klappte es grundsätzlich auch. Nur Türschloss öffnete nicht.
Extrem komisch. Als ob er es übersprungen hat. Ich versteh es nicht. Werde heute Abend noch mal testen.
Mein Dimmlicht ist in einem zweiten DOIF auch nicht angegangen. Ging gestern noch an. Da hab ich aber das repeatsame auf 25 gestellt. Eventuell will er den Wert nicht. Werde ich mal zurück auf 10 stellen.
Grüße,
Visionsurfer