Hallo zusammen,
ich habe in Verbindung von AT und NOTIFY folgendes Problem:
Ich möchte per Notify über Telegram an eine Tabletteneinnahme erinnert werden. FHEM soll nun, nachdem ich morgens die erste Tablette genommen habe und dies per Telegramnachricht (Dummy von Nein auf Ja) FHEM mitgeteilt habe, mich alle 4 Stunden an diese Tablette per Nachricht erinnern. Diese Nachrichten sollen im minutentakt eingehen, bis ich bestätigt habe, das ich die Tablette genommen habe. Nun zu meinem Problem:
Leider erstellt FHEM nach dem ersten Mal kein neues AT.
Mein Notify sieht so aus:
tablette {
if (Value("tablette") eq "ja") {
fhem("set telegrambot.Do send Tablette nehmen!!");
fhem("set tablette nein");
fhem("define tabletten_info_timer at +0:00:20 set tablette ja");
}
elsif (Value("tablette") eq "nein"){
fhem("set tablette nein");
}
}
Internals:
FUUID 5f68c2f3-f33f-85ae-02a8-1a777fcb016aa09b
NAME tablette
NR 53
STATE nein
TYPE dummy
READINGS:
2020-09-21 19:46:59 state nein
Attributes:
room Notify
setList ja nein
webCmd ja:nein
telegrambot.Do ist mein TelegramBot
Hier ein Auszug aus dem Eventmonitor:
2020-09-21 19:46:39 TelegramBot telegrambot.Do send Tablette nehmen!!
2020-09-21 19:46:39 at tabletten_info_timer Next: 19:46:59
2020-09-21 19:46:39 Global global DEFINED tabletten_info_timer
2020-09-21 19:46:39 dummy tablette ja
2020-09-21 19:46:39 dummy tablette nein
2020-09-21 19:46:39 TelegramBot telegrambot.Do sentMsgResult: SUCCESS
2020-09-21 19:46:39 TelegramBot telegrambot.Do sentMsgId: 672
2020-09-21 19:46:39 TelegramBot telegrambot.Do sentMsgPeerId: *************8
2020-09-21 19:46:59 TelegramBot telegrambot.Do send Tablette nehmen!!
2020-09-21 19:46:59 dummy tablette ja
2020-09-21 19:46:59 dummy tablette nein
2020-09-21 19:47:00 TelegramBot telegrambot.Do sentMsgResult: SUCCESS
2020-09-21 19:47:00 TelegramBot telegrambot.Do sentMsgId: 673
2020-09-21 19:47:00 TelegramBot telegrambot.Do sentMsgPeerId: ************8
Hier der Auszug aus dem Log: (Danke an Otto123 für den Hinweis):
2020.09.21 19:46:23 3: define tabletten_info_timer at +0:00:20 set tablette ja : tabletten_info_timer already defined, delete it first
2020.09.21 19:46:23 3: n_tabletten_test return value: tabletten_info_timer already defined, delete it first
2020.09.21 19:46:59 3: define tabletten_info_timer at +0:00:20 set tablette ja : tabletten_info_timer already defined, delete it first
2020.09.21 19:46:59 3: n_tabletten_test return value: tabletten_info_timer already defined, delete it first
Wie ihr seht startet beim 1. Mal (Status von Telegram gesetzt) der Timer, wenn er sich allerdings dann beim 2. Mal selber aufrufen würde, wird nur noch die Telegramnachricht versendet.
Ich hoffe, ich konnte das Problem einigermaßen verständlich schildern.
Hi,
grundlegend bitte das beachten: https://forum.fhem.de/index.php/topic,71806.0.html
Ok hat sich teilweise überschnitten - Du hast editiert :)
Vermutung: Du erzeugst quasi rekursiv das gleiche at. Da es schon da ist wird es nicht neu erzeugt.
Dein Auszug ist aus dem Eventmonitor, schau mal ins Log dort wird es eventuell bei der 2. Runde Fehler geben ( was zu beweisen war )
1. Tipp: niemals einfach auf alles reagieren! notify Trigger tablette:.ja tablette:ja spart Dir das if (){}
2. Tipp: Versuch es einfach mit einem sleep 20
3. Tipp das hier:
elsif (Value("tablette") eq "nein"){
fhem("set tablette nein")
Ist doch redundant? Wenn nein dann nein?
Gruß Otto
Endlich ein Beispiel, wo die Rekursive-Endlosschleife-Vermeidung sinnvoll zuschlaegt. :)
Hey,
schonmal Danke für die schnellen Tips. War leider erst nach dem Speichern über die "Code"-Markierung gestolpert....
Ich habe nun mein Notify wie folgt angepasst:
tablette:.ja
set telegrambot.Do send Tablette nehmen!!;
set tablette nein;
define tabletten_info_timer at +0:00:20 set tablette ja;
Leider passiert nun gar nichts mehr, das Notify "löst" nicht aus...
Wo liegt denn nun mein Fehler :-\
Vorschlag:
defmod tablette dummy
attr tablette room tablette
attr tablette setList ja nein
attr tablette webCmd ja:nein
defmod n_ja notify tablette:ja define a_tablette at +*00:00:10 setreading tablette Alarm on
attr n_ja room tablette
defmod n_nein notify tablette:nein delete a_tablette;;setreading tablette Alarm off
attr n_nein room tablette
Kann man eleganter machen, aber so ist es ausführlich :)
Der Alarm ist nur symbolisch, musst Du deine Variante nehmen ;)
Zitat von: metzedo am 21 September 2020, 20:27:56
Wo liegt denn nun mein Fehler :-\
Du hast nicht den Eventmonitor zum erzeugen des notifys genommen ;) siehe mein Code.
Mein Tipp oben war falsch, hab es korrigiert.
Falls ein notify nicht reagiert, dann am besten das notify ueber den Event-Monitor anlegen oder den Notify-Regexp darueber anpassen.
anstatt der zwei notify:
defmod n_ja2 notify tablette:ja define a_tablette at +*00:00:10 setreading tablette Alarm on;;sleep tablette:nein;; delete a_tablette
attr n_ja2 room tablette
Super!!!
Vielen Dank, damit geht es!!