Ein DOIF oder notify um mehrere Geräte zu überwachen

Begonnen von patlabor, 13 Dezember 2015, 10:36:36

Vorheriges Thema - Nächstes Thema

patlabor

Hallo zusammen,

ich hatte bis vor kurzem ein notify das Residents die auf "awoken" gestellt wurden 5 Minuten später auf "home" stellt.
Vermutlich wäre das auch einfacher gegangen, aber so wie ich es hatte hat es zumindes funktioniert :D
define aufwachentohome notify rr_.*:awoken {fhem("delete @home")};{fhem('define @home at +00:05 IF ([@] eq "awoken") (set @ home)')}

Das hat zwar jedesmal einen Fehler im Log erzeugt wenn das notify zum ersten mal getriggert wurde, hat aber zuverlässig 5 minuten nachdem ein Bewohner "awoken" wurde auf home umgeschaltet.

Jetz habe ich fhem geupdatet und natürlich funktioniert das ganze Konstrukt nicht mehr. Also schnell @ durch $NAME ersetzt, also:
rr_.*:awoken {fhem("delete $NAMEhome")};{fhem('define $NAMEhome at +00:05 IF ([$NAME] eq "awoken") (set $NAME home)')}

was aber leider dazu führt, das ich nur noch Fehler erhalte, aber kein umschalten auf home mehr erfolgt.
2015.12.13 10:28:04 2: ROOMMATE set rr_Carla awoken
2015.12.13 10:28:04 3: aufwachentohome return value: Global symbol "$NAMEhome" requires explicit package name at (eval 29221) line 1.


Jetzt wollte ich das ganze mit DOIF nachbilden, weil es mir dann doch etwas eleganter und besser lesbar erscheint, leider scheitert das schon an der definition, bei:
DOIF ([rr_.*] eq "awoken) wird [rr_.*] als Zeitangabe gedeutet und wirf einen Fehler:

di_aufwachen DOIF: Wrong timespec rr_.*: either HH:MM:SS or {perlcode}: rr_.*

Gibt es eine elegante Möglichkeit das ganze zu lösen?
Ich wollte eigentlich vermeiden, für jeden Roommate ein eigenes notify oder besser DOIF anzulegen.

Ellert

Im DOIF müssen Geräte mit ihrem vollständigen Namen angesprochen werden, wenn Heinz und Trudi Bewohner sind, dann etwa so define di DOIF ([rr_Heinz:?awoken] or [rr_Trudi:?awoken]) (set [di:Device] home)
DOELSE
attr di wait 300

Nur eine Idee, ungetestet, bitte die Syntax prüfen. Einschränkung: Innerhalb von 5 min nach Heinz(Trudi) darf Trudi(Heinz) nicht aufwachen, da müsste noch dran gefeilt werden.

Das (set [di:Device] home) habe ich selbst noch nicht probiert.

Damian

Zitat von: Ellert am 13 Dezember 2015, 14:19:13
Im DOIF müssen Geräte mit ihrem vollständigen Namen angesprochen werden, wenn Heinz und Trudi Bewohner sind, dann etwa so define di DOIF ([rr_Heinz:?awoken] or [rr_Trudi:?awoken]) (set [di:Device] home)
DOELSE
attr di wait 300

Nur eine Idee, ungetestet, bitte die Syntax prüfen. Einschränkung: Innerhalb von 5 min nach Heinz(Trudi) darf Trudi(Heinz) nicht aufwachen, da müsste noch dran gefeilt werden.

Das (set [di:Device] home) habe ich selbst noch nicht probiert.

Nächstes Jahr wird es ein Update geben, dann wird man mehrere Devices mit regex ansprechen können.
(set [di:Device] home) funktioniert aber jetzt schon.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

patlabor

Leider müsste ich in diesem Fall, im DOIF jeden einzelnen Bewohner speziell aufzählen, genau das wollte ich eigentlich vermeiden, da sich die Bewohner gelegentlich ändern, und ich nicht dauernd "hinterherprogrammieren" will. Auch die Einschränkung das die Bewohner nicht innerhalb von 5 Minuten aufwachen dürfen ist so leider nicht praktikabel, es soll schon für jeden einzelne Person ein unabhängiger Timer existieren egal wann derjenige aufwacht.

Schade, vorher mit @ im notify hat das eigentlich ganz gut geklappt, als Notlösung habe ich jetzt mal für jeden ein eigenes DOIF gemacht, aber auf dauer ist das keine Lösung.

justme1968

#4
wenn du dir den text hinter dem roten update hinweis rechts oben im forum durchliest erfährst du das du statt @ einfach $NAME verwenden musst.

statt dem delete und define kannst du defmod verwesenden dann gibt es keine warnung.

oder du verwendest statt dem at ein fhem sleep. das finde ich noch etwas kürzer.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Ellert

Zitat von: patlabor am 17 Dezember 2015, 05:29:53
Leider müsste ich in diesem Fall, im DOIF jeden einzelnen Bewohner speziell aufzählen, genau das wollte ich eigentlich vermeiden, da sich die Bewohner gelegentlich ändern, und ich nicht dauernd "hinterherprogrammieren" will. Auch die Einschränkung das die Bewohner nicht innerhalb von 5 Minuten aufwachen dürfen ist so leider nicht praktikabel, es soll schon für jeden einzelne Person ein unabhängiger Timer existieren egal wann derjenige aufwacht.

Schade, vorher mit @ im notify hat das eigentlich ganz gut geklappt, als Notlösung habe ich jetzt mal für jeden ein eigenes DOIF gemacht, aber auf dauer ist das keine Lösung.

Deine Anforderung lautete aber so:
ZitatIch wollte eigentlich vermeiden, für jeden Roommate ein eigenes notify oder besser DOIF anzulegen.

patlabor

Zitat von: justme1968 am 17 Dezember 2015, 09:04:58
wenn du dir den text hinter dem roten update hinweis rechts oben im forum durchliest erfährst du das du statt @ einfach $EVENT verwenden musst.

statt dem delete und define kannst du sefmod verwesenden dann gibt es keine warnung.

oder du verwendest statt dem at eine fhrmsleep. das finde ich noch etwas kürzer.

gruss
  andre

Die Hinweise habe ich natürlich gelesen, nur habe ich sie scheinbar falsch verstanden. Ich dachete $EVENT ist der "Ersatz" für % und nicht für @, da das dann auch von der Bezeichnung her Sinn machen würde. Daher habe ich ja auch die @ mit einem $NAME in meiner Definition ersetzt, leider hat dies jedoch zu fehlermeldungen geführt (s. Eröffnungspost). sefmod und fhrmsleep sagt mir leider garnichts, und finde ich jetzt auf die schnelle auch nichts dazu. meine definiton ist allerdings auch schon recht alt, und da sie funktioniert hat, bin ich auch nicht so wirklich auf dem laufenden was sich in letzter zeit an neuen befehlen getan hat. sobald ich wieder an meinem rechner sitzte, werde ich meine "alte" definition mal mit $EVENT anstatt $NAME versuchen und schau mit mal sefmod und fhrmsleep an.

Zitat von: Ellert am 17 Dezember 2015, 09:16:26
Deine Anforderung lautete aber so:

Ich wollte eigentlich vermeiden, für jeden Roommate ein eigenes notify oder besser DOIF anzulegen.

Klar, und zwar wollte ich das vermeiden, weil sich die genaue zusammensetzung der Bewohner relativ häufig andert

Ellert

Mir fällt gerade auf, das Du ' als Anführungszeichen benutzt, in
Zitatrr_.*:awoken {fhem("delete $NAMEhome")};{fhem('define $NAMEhome at +00:05 IF ([$NAME] eq "awoken") (set $NAME home)')}

Perl ersetzt nur in "$NAMEhome" $NAME durch den Inhalt von $NAME.

JoeALLb

Als Notify habe ich das ganz ähnöich wie Du umgesetzt:
Anbei mein Code grob angepasst an deine Bedürftnusse:

define aufwachentohome notify rg_.*:awoken {fhem("delete at_tmp_$NAME")};; {fhem("define -temporary at_tmp_$NAME at +00:05 IF ($NAME eq 'awoken') (set $NAME home))")};;{fhem("attr at_tmp_$NAME room  2 Todo")}

Anmerkung: Ob Du "define -temporary" lieber weg lässt, musst du entscheiden.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

justme1968

@Ellert: sorry. der text war auf dem handy getippt und es waren lauter tippfehler drin.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Ellert

@justme1968: Ich habe verstanden was Du mit sefmod und fhrmsleep gemeint hast, patlabor nicht. Ich finde es trotzdem nett, dass Du es ansprichst.

patlabor

Zitat von: JoeALLb am 17 Dezember 2015, 15:59:36

define aufwachentohome notify rg_.*:awoken {fhem("delete at_tmp_$NAME")};; {fhem("define -temporary at_tmp_$NAME at +00:05 IF ($NAME eq 'awoken') (set $NAME home))")};;{fhem("attr at_tmp_$NAME room  2 Todo")}


Habe gerade mal deinen Lösungsvorschlag versucht, leider auch ohne Erfolg. Jetzt taucht zwar kein Fehler mehr im log auf, aber weder wird irgendwo ein at_tmp_Beispiel angelegt, noch wird nach 5 minuten der Status von Beispiel geändert.

Irgendwie komme ich auch mit der neuen Schreibweise nicht klar. ich habe versuchsweise einfach mal das notify auf ein minimum reduziert:

rr_.*:awoken {fhem("defmod $NAMEhome at +00:05 set $NAME home")}


aber selbst das schmeisst einen fehler:

2015.12.21 10:17:21 3: aufwachentohome return value: Global symbol "$NAMEhome" requires explicit package name at (eval 74497) line 1.

JoeALLb

Zitat von: patlabor am 21 Dezember 2015, 10:33:27
aber weder wird irgendwo ein at_tmp_Beispiel angelegt

Lass das
-temporary
weg, dann wird es nicht "versteckt"
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Ellert

Zitat von: patlabor am 21 Dezember 2015, 10:33:27
Habe gerade mal deinen Lösungsvorschlag versucht, leider auch ohne Erfolg. Jetzt taucht zwar kein Fehler mehr im log auf, aber weder wird irgendwo ein at_tmp_Beispiel angelegt, noch wird nach 5 minuten der Status von Beispiel geändert.

Irgendwie komme ich auch mit der neuen Schreibweise nicht klar. ich habe versuchsweise einfach mal das notify auf ein minimum reduziert:

rr_.*:awoken {fhem("defmod $NAMEhome at +00:05 set $NAME home")}


aber selbst das schmeisst einen fehler:

2015.12.21 10:17:21 3: aufwachentohome return value: Global symbol "$NAMEhome" requires explicit package name at (eval 74497) line 1.

Dann wir $Name nicht aufgelöst und $NAMEhome wird als Variablenname interpretiert. Da solltest Du mit dem Stringverbinder "." arbeiten.

CoolTux

@patlabor
Vielleicht hast Du es schon gesehen aber es ist nicht das was Du suchst, aber schaue Dir mal die das Skript Macro_rr_$roommatename_wakeuptimer1 an. Das bekommst Du wenn Du ein set rr_$roommate create wakeuptimer im entsprechenden roommate device machst.
Ganz unten im Skript findest Du genau das was Du suchst.


if ($EVTPART3) {
                #fhem "set $EVTPART4:FILTER=STATE=asleep awoken";
fhem "define atTmp_9_$NAME at +00:00:30 set $EVTPART4:FILTER=STATE=asleep awoken";

# Without enforced wake-up, be jentle and just set user state to 'home' after some
# additional long nap time
} else {
fhem "define atTmp_9_$NAME at +00:30:00 set $EVTPART4:FILTER=STATE=asleep home";
    }




Grüße
Leon
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net