Notify nach einmal auslösen erst wieder bei Änderung eines Readings ausführen

Begonnen von TomLee, 28 September 2021, 12:11:54

Vorheriges Thema - Nächstes Thema

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

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".
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

frank

als erstes würde ich eine nicht "flatternde" anwesenheitserkennung auf die einkaufsliste setzen.  :)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

TomLee

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.

TomLee

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.

frank

Zitatkann mich aber nicht wirklich entscheiden
bluetootherkennung, kein wlan.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

TomLee

Das linke Ei hätt ich geröstet vor ein paar Wochen, mit d3m Xiaomi, wäre Bluetooth auch noch angewesen.

TomLee

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 ?


betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

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.




TomLee

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.

TomLee

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


TomLee

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

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.