Hauptmenü

Reading ist plötzlich falsch

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

Vorheriges Thema - Nächstes Thema

visionsurfer

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.


visionsurfer

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

Ma_Bo

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

Ma_Bo

Ja, das musst du auch hoch setzen.
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

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

AmunRe

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

visionsurfer

Moin,

ok, also hänge ich da einfach do always dran und dann sollte es gehen ?
Das wäre einfach :)

Grüße,
Visionsurfer

AmunRe

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.

4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

visionsurfer

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

Ma_Bo

#25
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.
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,

@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


Ma_Bo

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

Ellert

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

visionsurfer

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