Hauptmenü

Reading ist plötzlich falsch

Begonnen von visionsurfer, 20 November 2016, 17:29:58

Vorheriges Thema - Nächstes Thema

visionsurfer

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



Ellert

([([TabletNexus:nextAlarmTime]+300)])

visionsurfer

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

Ellert

Hier steht, was falsch ist "Wrong timespec off" hast Du das überlesen?

visionsurfer

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

Ellert

#5
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.

visionsurfer

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


AmunRe

#7
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.
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

Ma_Bo

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.
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

visionsurfer

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

Ma_Bo

NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

visionsurfer

@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

AmunRe

#12
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.
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

visionsurfer

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

AmunRe

#14
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.
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs