FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: visionsurfer am 20 November 2016, 17:29:58

Titel: Reading ist plötzlich falsch
Beitrag 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


Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ellert am 20 November 2016, 17:39:42
([([TabletNexus:nextAlarmTime]+300)])
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 20 November 2016, 17:49:47
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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ellert am 20 November 2016, 18:05:17
Hier steht, was falsch ist "Wrong timespec off" hast Du das überlesen?
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 20 November 2016, 18:22:18
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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ellert am 20 November 2016, 18:28:09
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.
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 20 November 2016, 18:38:38
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

Titel: Antw:Reading ist plötzlich falsch
Beitrag von: AmunRe am 20 November 2016, 20:09:53
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.
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ma_Bo am 20 November 2016, 20:17:32
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.
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 20 November 2016, 20:49:06
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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ma_Bo am 20 November 2016, 21:02:22
Ja
Titel: Antw:Reading ist plötzlich falsch
Beitrag 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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: AmunRe am 20 November 2016, 21:06:15
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.
Titel: Antw:Reading ist plötzlich falsch
Beitrag 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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: AmunRe am 20 November 2016, 21:16:24
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.
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 20 November 2016, 21:35:16
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.

Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 20 November 2016, 22:03:06
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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ma_Bo am 20 November 2016, 22:10:42
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.
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 20 November 2016, 22:27:59
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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ma_Bo am 20 November 2016, 22:53:17
Ja, das musst du auch hoch setzen.
Titel: Antw:Reading ist plötzlich falsch
Beitrag 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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: AmunRe am 21 November 2016, 07:26:14
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"
Titel: Antw:Reading ist plötzlich falsch
Beitrag 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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: AmunRe am 21 November 2016, 10:41:25
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.

Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 21 November 2016, 11:07:08
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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ma_Bo am 21 November 2016, 16:14:06
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.
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 21 November 2016, 20:07:51
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

Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ma_Bo am 21 November 2016, 20:11:10
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
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: Ellert am 22 November 2016, 08:02:31
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.
Titel: Antw:Reading ist plötzlich falsch
Beitrag von: visionsurfer am 22 November 2016, 10:54:02
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