Hallo,
kann mir vorstellen das ich auch auf dem Holzweg bin und nicht an alle Szenarien denke die eintreten können.
Mein altes IPhone meldet sich ab und an auch während der Anwesenheit zwischendurch mal vom WLAN ab.
Dann löst mein notify aus und schickt mir meine Einkaufsliste:
defmod not_sp_Thomas_pushek_isday notify sp_Thomas:presence:.absent {if(isday()) {fhem('pushek')}}
attr not_sp_Thomas_pushek_isday group Einkaufsliste
attr not_sp_Thomas_pushek_isday room Fernando
setstate not_sp_Thomas_pushek_isday 2021-09-28 11:06:23
setstate not_sp_Thomas_pushek_isday 2021-09-25 19:23:48 state active
Würde gerne verhindern das dies mehrmals am Tag passiert, die Liste nur einmal am Tag gesendet wird wenn sich an der Liste nichts geändert hat.
Wie könnt ich das umsetzen daß das notify nach einmal auslösen erst wieder bei einem weiteren Event/Änderung des Einkaufsliste-Reading auslöst.
Mein erster Gedanke war disabledafterTrigger dort kann man ja aber nur Sekunden angeben, dort einfach nur das Reading anzugeben wär ja zu schön gewesen. Und sonst komm ich auch nach zwei Tagen darüber nachdenken immer noch auf keine Lösung, evtl. in ein paar weiteren 8) Tagen, darum frag ich jetzt einfach mal nach.
Gruß
Thomas
edit:
klar kenn ich mittlerweile das Eventbasierte sleep, mir kommt aber nicht wie ich es damit umsetzen kann.
Wie wäre es mit einem watchdog?
Also erst ein wenig warten, ob das Handy sich nicht zurückmeldet => weniger "action".
Dann: watchdog nicht gleich wieder aktivieren, sondern nur, wenn entweder "neuer Tag" ist, oder sich die EK-Liste geändert hat?
Bevorzugen würde ich gerne eine Lösung die in dem notify umzusetzen, ohne zusätzliches Device, hätt ich vlt. oben gleich erwähnen sollen.
Schön und gut mit dem watchdog, aber innerlich wehrt sich schon beim lesen alles in mir 8)
Nun ja, dann wirst du wohl ein paar Rahmenbedingungen abspeichern müssen, die dann erst mal bei jedem neuen Trigger gegengecheckt werden müssen und dann vermutlich erst mal ein "sleep/InternalTimer" einbauen dürfen, damit der "bin weg"-Event nicht direkt immer durchschlägt... Ob das einfacher ist (wobei es sich sowieso anbieten würde, den "gone"-Event anders zu ermitteln)?
Du kannst es im Ausführungsteil mit einem benannten sleep versuchen, welches auf deinen Reading Event wartet. Durch die Benennung werden nicht immer wieder neue sleeps erzeugt wenn Dein Handy "wackelt" ;)
Im Notify könntest Du Prüfen, ob sich die Einkaufliste geädert hast und nur dann senden. Müsstest Du aber programmieren ... für weitere Tipps müsste man wissen, wie denn die Einkaufliste bei Dir vorliegt ....
ZitatOb das einfacher ist ?
Sag mal so, beim lesen des letzten Vorschlag hat sich bei mir nix gewehrt, Interesse wurde geweckt, Hirnzellen etwas benutzt und ich denke dich dann zumindest ansatzweise verstanden zu haben, bis auf das
Zitatwobei es sich sowieso anbieten würde, den "gone"-Event anders zu ermitteln
Ich arbeite jetzt was, lass mir das den Nachmittag noch weiter durch den Kopf gehen und zeige später, Morgen, die Tage mein Ergebnis.
Danke.
Zitatwie denn die Einkaufliste bei Dir vorliegt
Das ist die Einkaufsliste aus echodevice:
setstate Echo 2021-09-28 12:57:17 list_SHOPPING_ITEM kleine_batterien,honig,eis,ahornsirup,pizzagewürz
(Ja, ich sehe gerade selbst das dort mal timestamp-on-change gesetzt gehört)
ZitatIm Notify könntest Du Prüfen, ob sich die Einkaufliste geädert hast und nur dann senden.
Ich denke es so umzusetzen (schüttel mir das zwar nicht aus dem Ärmel, aber ich weiß das ich es irgendwo im Hinterkopf habe/bereits gelernt hatte, wie der Vergleich zu machen wäre) ist kürzer und einfacher wie Beta-Users Vorschlag.
Ich würde es mal so versuchen?
defmod not_sp_Thomas_pushek_isday notify sp_Thomas:presence:.absent {if(isday()) {fhem('sleep Echo:list_SHOPPING_ITEM:.* LSI;;pushek')}}
Weiß jetzt nicht genau, aber eine Idee währe:
Ein Hash der Einkaufliste in ein Dummy schreiben. Beim Auslösen des Notify prüfen:
- Hat sich der Hash geändert, wenn ja
-> Mail senden
-> Neuen Hash ermitteln und Abspeichern
... Wobei, geht natürlich auch ohne hash, sondern mit dem aktuellen Inhalt. Du brauchst eben nur ein Dummy, wo Du nach dem senden den Wert speichern kannst ....
ZitatIch würde es mal so versuchen?
Erst dacht ich Otto hatts noch nicht genau verstanden, zwei-drei Minuten hab ich erst verstanden das es sehr wsl.
die Lösung ist, ich probiers später.
Zitat... Wobei, geht natürlich auch ohne hash, sondern mit dem aktuellen Inhalt. Du brauchst eben nur ein Dummy, wo Du nach dem senden den Wert speichern kannst ....
Dummy setzt dem watchdog jetzt aber noch eins drauf 8), warum, wenn in die Richtung, nicht OldReadingsVal verwenden oder hab ich was nicht verstanden.
Stimmt ... OldReadingsVal ... vergesse ich immer, da ich in den Anfängen von fhem damit Probleme hatte .....
...vermutlich habe ich den zeitlichen Verlauf nicht verstanden...
Ottos Vorschlag mit dem "notify-sleep" setzt voraus, dass erst das Handy weg ist, und sich dann die EKL ändert? Ist das so gewollt? Sonst könnte man die Events umdrehen.
Wenn tatsächlich nur auf Handy-"absent" getriggert werden soll: Warum nicht ReadingsAge() von der Liste abfragen? Nur raus, wenn heute (oder <24h?) geändert.
ich habe den Fall betrachtet: Handy "flattert" und nur wenn sich die Liste ändert soll gesendet werden. Der Fall Handy flattert nicht und die Liste ändert sich und soll gesendet werden geht so natürlich nicht. Events tauschen ist da vielleicht die Lösung - überblick es noch nicht ganz.
ich glaube, das ist alles viel zu kompliziert gedacht.
Wäre es denn nicht vom Ablauf her logischer, primär auf die Änderung der Einkaufsliste zu triggern und bei einer Änderung der Liste das Handy zu informieren?
Zitat von: betateilchen am 28 September 2021, 15:50:05
ich glaube, das ist alles viel zu kompliziert gedacht.
Wäre es denn nicht vom Ablauf her logischer, primär auf die Änderung der Einkaufsliste zu triggern und bei einer Änderung der Liste das Handy zu informieren?
In diese Richtung ging mein Vorschlag mit dem watchdog: Scharf schalten, wenn die Liste sich geändert hat. Dann muss nur noch das Handy länger auf "bin dann mal weg".
als erstes würde ich eine nicht "flatternde" anwesenheitserkennung auf die einkaufsliste setzen. :)
Ich hatte mir vor drei Wochen ein Xiaomi Redmi 10S gekauft, weil ich mir kein IPhone mehr zulegen wollte, das war aber mehr Hosentaschenwärmer wie Smartphone, das hab ich dann wieder zurückgegeben, jetzt bin ich doch wieder am überlegen bei einem IPhone zu bleiben, kann mich aber nicht wirklich entscheiden.
Ich hab mal versucht die letzten Beiträge in einem notify zusammenzufassen, was fehlt wäre eine Verzögerung des pushek-Befehls sollte sich das Handy doch nach x-Minuten wieder anmelden, kam mir jetzt keine Idee vlt. später. Ich kenn mich aber und übersehe irgendeinen Fall mit Sicherheit.
defmod not_sp_Thomas_pushek_isday notify Echo:list_SHOPPING_ITEM:.* {return fhem('sleep sp_Thomas:presence:.absent sta;;pushek') if isday() && ReadingsVal($NAME,'list_SHOPPING_ITEM','') ne OldReadingsVal($NAME,'list_SHOPPING_ITEM','')}
edit:
OK, der Vergleich am Ende ist Quark, ohne Änderung greift das notify ja auch nicht.
Zitatkann mich aber nicht wirklich entscheiden
bluetootherkennung, kein wlan.
Das linke Ei hätt ich geröstet vor ein paar Wochen, mit d3m Xiaomi, wäre Bluetooth auch noch angewesen.
Es wäre toll wenn nach Abwesenheit mit :
defmod not_sp_Thomas_pushek_isday notify Echo:list_SHOPPING_ITEM:.* {return fhem('sleep sp_Thomas:presence:.absent sta;;pushek') if isday()}
attr not_sp_Thomas_pushek_isday group Einkaufsliste
attr not_sp_Thomas_pushek_isday room Fernando
setstate not_sp_Thomas_pushek_isday 2021-09-29 10:26:20
setstate not_sp_Thomas_pushek_isday 2021-09-28 20:10:33 state active
auch eine Mitteilung geschickt wird, sollte zu Hause jemand die Liste erweitern.
Das ist ja kein Problem, einfach nur event-on-update-reading in dem Presence-Device setzen:
defmod sp_Thomas PRESENCE function {ReadingsVal('sp_Thomas_FB','presence','present') eq 'absent' && ReadingsVal('sp_Thomas_UF','presence','present') eq 'absent' ? '0' : '1'} 60 60
attr sp_Thomas devStateIcon {my $var = ReadingsVal($name,'presence','absent') eq 'present'?'10px-kreis-gruen':'10px-kreis-rot';;\
my $var1= ReadingsTimestamp($name,'presence',0);;\
my $seconds = time_str2num($var1);;\
my $result = FmtDateTime($seconds);;\
'<div>'.FW_makeImage($var).' '.$result.'</div>'}
attr sp_Thomas event-on-change-reading presence
attr sp_Thomas event-on-update-reading presence
attr sp_Thomas room Fritzbox
attr sp_Thomas timestamp-on-change-reading presence
setstate sp_Thomas absent
setstate sp_Thomas 2021-09-29 10:47:21 .absenceThresholdCounter 0
setstate sp_Thomas 2021-09-29 10:47:21 .presenceThresholdCounter 0
setstate sp_Thomas 2021-09-29 10:07:10 model function
setstate sp_Thomas 2021-09-29 10:47:21 presence absent
setstate sp_Thomas 2021-09-29 10:47:21 state absent
Ohne das Attribut keine Aktualisierung, schon klar aber was mir dabei nicht so gefällt ist halt das Event alle 60 Sekunden, nur um zu schauen ob die Liste erweitert wurde.
Ich bin bisher immer bestrebt gewesen so wenige Events im Event-Monitor zu sehen wie nur möglich (ja natürlich gibts hier und da noch ein paar Geräte an die ich mich noch ranmachen muss zu optimieren).
Würdet Ihr das Event im Intervall von 60 Sekunden bedenkenlos hinnehmen, nur um die Liste zu aktualisieren oder vlt. sogar eine andere Idee ?
Zitat von: TomLee am 29 September 2021, 11:03:25
nur um die Liste zu aktualisieren oder vlt. sogar eine andere Idee ?
Zitat von: betateilchen am 28 September 2021, 15:50:05
Wäre es denn nicht vom Ablauf her logischer, primär auf die Änderung der Einkaufsliste zu triggern und bei einer Änderung der Liste das Handy zu informieren?
Zitat von: Beta-User am 28 September 2021, 16:00:06
In diese Richtung ging mein Vorschlag mit dem watchdog: Scharf schalten, wenn die Liste sich geändert hat. Dann muss nur noch das Handy länger auf "bin dann mal weg".
Beratungsresistent?
Ich verstehe es so das mit dem notify die zwei Vorschläge abgefrühstückt sind, wenn nicht wärs nett einen Hinweis zu bekommen, was nicht passen soll, ich bin der Meinung das klappt so wie ich mir das vorgestellt hatte und Ihr beschrieben.
Ich hatte event-on-update-reading zuvor nicht gesetzt gehabt, weils einfach nicht nötig war, wenn aber eine Aktualisierung der Liste während der Abwesenheit erfolgen soll. muss es dafür gesetzt werden und ich hab dazu ein zusätzliches Event alle 60 Sekunden in meinem FHEM nur um die Liste aktuell zu halten.
Ich gehe jede Wette ein das du das notify gar nicht wirklich nachvollzogen hast, wie damals bei dem Problem mit Each, sonst wärst du auf meine Frage eingegangen, ob das Not tut soviele Events zu erzeugen, nur für den Fall das während der Abwesenheit es mal vorkommen kann das die Liste erweitert wird.
So, hab ich mir jetzt überlegt kann man das lösen ohne die vielen Events (event-on-update-reading) in dem PRESENCE-Device :
defmod not_sp_Thomas_pushek_isday notify Echo:list_SHOPPING_ITEM:.* {
return fhem('sleep sp_Thomas:presence:.absent sta;;pushek') if isday() && ReadingsVal('sp_Thomas','presence','presence') eq 'present';;\
return fhem('pushek') if isday() && ReadingsVal('sp_Thomas','presence','presence') eq 'absent';;}
attr not_sp_Thomas_pushek_isday group Einkaufsliste
attr not_sp_Thomas_pushek_isday room Fernando
setstate not_sp_Thomas_pushek_isday 2021-09-30 12:43:40
setstate not_sp_Thomas_pushek_isday 2021-09-30 12:42:34 state active
Ich bin von der Lösung überzeugt, darum hab ich geschaut das ich sie noch etwas kürzer bekomme:
defmod not_sp_Thomas_pushek_isday notify Echo:list_SHOPPING_ITEM:.* {\
my $v= ReadingsVal('sp_Thomas','presence','presence') eq 'present';;\
return fhem('sleep sp_Thomas:presence:.absent sta;;pushek') if isday() && defined $v;;\
return fhem('pushek') if isday() && !defined $v ;;}
attr not_sp_Thomas_pushek_isday group Einkaufsliste
attr not_sp_Thomas_pushek_isday room Fernando
setstate not_sp_Thomas_pushek_isday 2021-09-30 18:04:21
setstate not_sp_Thomas_pushek_isday 2021-09-30 18:03:42 state active
Zitat von: TomLee am 30 September 2021, 18:29:14
my $v= ReadingsVal('sp_Thomas','presence','presence') eq 'present';;\
return fhem('sleep sp_Thomas:presence:.absent sta;;pushek') if isday() && defined $v;;\
return fhem('pushek') if isday() && !defined $v ;;}
Wie soll in Deinem Code eigentlich die Bedingung "!defined $v" jemals WAHR werden?
Das Ergebnis eines logischen Vergleiches, das einer Variablen zugewiesen wird, sorgt dafür dass diese Variable immer defined ist.
Ich hatte getestet aus der Kommandozeile, während sp_Thomas present ist:
{ my $v= ReadingsVal('sp_Thomas','presence','presence') eq 'present';; return 'bla' if isday() && !defined $v;;}
-> nix
{ my $v= ReadingsVal('sp_Thomas','presence','presence') eq 'present';; return 'bla' if isday() && defined $v;;}
->bla
Da geb ich zu kann ich gerade nicht folgen, muss ich in_Ruhe darüber nachdenken, später oder Morgen, jetzt nicht.
Ok, in der Variable steht aber drin wahr oder falsch, also kann ich einfach nur die Variable für das erste return nehmen und im zweiten return die Variable negieren:
defmod not_sp_Thomas_pushek_isday notify Echo:list_SHOPPING_ITEM:.* {\
my $v= ReadingsVal('sp_Thomas','presence','presence') eq 'present';;\
return fhem('sleep sp_Thomas:presence:.absent sta;;pushek') if isday() && $v;;\
return fhem('pushek') if isday() && !$v ;;}
attr not_sp_Thomas_pushek_isday group Einkaufsliste
attr not_sp_Thomas_pushek_isday room Fernando
setstate not_sp_Thomas_pushek_isday 2021-10-01 11:26:06
setstate not_sp_Thomas_pushek_isday 2021-10-01 11:19:14 state active
edit:
ohne es getestet zu haben noch etwas kürzer:
defmod not_sp_Thomas_pushek_isday notify Echo:list_SHOPPING_ITEM:.* {\
my $d = isday();
my $v= ReadingsVal('sp_Thomas','presence','presence') eq 'present';;\
return fhem('sleep sp_Thomas:presence:.absent sta;;pushek') if $d && $v;;\
return fhem('pushek') if $d && !$v ;;}
attr not_sp_Thomas_pushek_isday group Einkaufsliste
attr not_sp_Thomas_pushek_isday room Fernando
setstate not_sp_Thomas_pushek_isday 2021-10-01 11:26:06
setstate not_sp_Thomas_pushek_isday 2021-10-01 11:19:14 state active
Da Zuweisen von isday() an eine Variable kannst Du Dir getrost sparen. Es geht nicht um kürzer, sondern um perfomanter.
Hier noch was zum Nachdenken übers Wochenende...
defmod not_sp_Thomas_pushek_isday notify Echo:list_SHOPPING_ITEM:.* { \
return unless isday();; \
if(ReadingsVal('sp_Thomas','presence','presence') eq 'present') \
{ return fhem('sleep sp_Thomas:presence:.absent sta;;pushek');; } else \
{ return fhem('pushek');; }}
Du hältst an dem unless fest, bei einem anderen Mitlesenden hast du mit Sicherheit kurzzeitig für min. 60 % "CPU"-Auslastung gesorgt 8) ;D , ich hab das gestern Abend ausprobiert und es sprach eigentlich nichts dagegen if !isday zu verwenden oder doch ?
Ist das Beispiel performanter weil gleich Ende ist wenn nicht Tag ?
Du magst das gewohnt sein mit der Variante von if und den vielen Klammern und vermutlich ging es dir nur darum diesen Ansatz aufzuzeigen, mir gefällts irgendwie in dem Fall weniger, spricht was dagegen hier einfach den ternären Operator zu verwenden ? Dann wäre das auch kurz und knapp in dem notify, weil ich noch nicht weiß ob ich das auslagere.
Zitat von: TomLee am 02 Oktober 2021, 15:23:42
mit Sicherheit kurzzeitig für min. 60 % "CPU"-Auslastung gesorgt
Quatsch. "unless ..." ist nichts anderes als Dein "if !..." bzw. "if not ..."
https://www.perltutorial.org/perl-unless/
Zitat von: TomLee am 02 Oktober 2021, 15:23:42
Du magst das gewohnt sein mit der Variante von if und den vielen Klammern
Das hat nichts mit Gewohnheit zu tun, sondern mit (Programmier-)Logik.
Mach was Du willst, zur Not bleib halt auch bei Deinem Spaghetti-Code (https://de.wikipedia.org/wiki/Spaghetticode)
--
Unsinn oder nicht, ich halts fest:
Für die die sich mit einem Nudelgericht zufrieden geben:
defmod not_sp_Thomas_pushek_isday notify Echo:list_SHOPPING_ITEM:.* {\
return if !isday();;\
return ReadingsVal('sp_Thomas','presence','presence') eq 'present' ? fhem('sleep sp_Thomas:presence:.absent sta;;pushek') : fhem('pushek');;}