Hallo zusammen,
ich versuche mich gerade mit einem weiteren Notify, doch leider funktioniert es nicht so wie gewünscht.
Es reagiert halt immer und nicht nur zwischen der angegebenen Zeit.
WZ.Hub.currentActivity:.PowerOff IF ($hms gt "22:00" or $hms lt "3:00") ((set LichtFlurSicherung on-for-timer 120), (set Sonos_Kueche Speak 30 de Gute Nacht), (define Time1 at +00:01:00 set HUEGroup1 off))
Den Code habe ich so im DEF definiert
- Das Notify "reagiert" sobald ich mit der Harmony den Fernseher etc. ausschalte
- Licht im Flur geht dann für 120sek an
- Sonos startet Sprachausgabe "Gute Nacht"
- Licht im Wohnzimmer wird nach einer Minute ausgeschaltet
Wie gesagt die "Set Befehle" funktionieren, jedoch egal zu welcher Zeit.
Was macht ich falsch ?
Wie muss ich den Zeitraum angeben ?
Grüße & Danke vorab
Torsten
P.S.: Habe gerade noch gemerkt das die Sprachausgabe 3x hintereinander erfolgt. Muss da wohl nochmal schauen warum
schau dir mal diesen thread an, interessant ist für dich die funktion isTime
https://forum.fhem.de/index.php/topic,76333 (https://forum.fhem.de/index.php/topic,76333)
Hier einmal der Einfachheit halber
sub isInTime($) {
my $dfi = shift;
$dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge; # Forum #69787
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $dhms = sprintf("%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec);
foreach my $ft (split(" ", $dfi)) {
my ($from, $to) = split("-", $ft);
if(defined($from) && defined($to)) {
$from = "$wday\@$from" if(index($from,"@") < 0);
$to = "$wday\@$to" if(index($to, "@") < 0);
return 1 if($from le $dhms && $dhms le $to);
}
}
return 0;
}
Diese Funktion bitte in eine 99_myUtils eintragen und abfragen mit
isInTime('22:00-24:00 00:00-04:00')
Alles schaue ich mir mal genauer an ;)
Aber auf dem ersten Blick geht es dann darum entweder eine Funktion in der 99_myUtils.pm einzubauen anstatt meiner Notify und/oder auf Perl Ebene, oder ?
Wenn ich es richtig verstehe bewege ich mit den Klammen "{ }" auf Perl ebenen und nicht im FHEM oder ?
An Funktionen in 99_myUtils.om will ich erst ran wenn ich mich weiter mit allem beschäftigt habe.
Ebenso mit DOIF.
Habe zwar schon auch zwei, drei DOIF am laufen.
Möchte aber gerne zu beginn erstmal NOTIFY richtig verstehen, bevor ich dann weiter mit DOIF mache. Unabhängig davon was welche Vorteile und Nachteile hat.
Bin doch neu und will lernen ;) :)
Grüße
Torsten
Alternativ Doif verwenden. ([WZ.Hub.currentActivity:.Power off] and ([22:00-24:00] or [00:00-04:00])) (set.......)
Gesendet von meinem S3_32 mit Tapatalk
@CoolTux
Danke !
Hab deinen Beitrag erst gesehen, als ich meine Antwort geschrieben hatte.
Also den Code in 99_myUtils kopieren und dann in mein Notify isInTime einbauen ?
So ?
WZ.Hub.currentActivity:.PowerOff IF (isInTime('22:00-04:00')) ((set LichtFlurSicherung on-for-timer 120), (set Sonos_Kueche Speak 30 de Gute Nacht Schlaft schön ihr zwei), (define Time1 at +00:01:00 set HUEGroup1 off))
Danke & Grüße
Torsten
Zitat von: TottiToad am 14 September 2017, 20:48:43
Aber auf dem ersten Blick geht es dann darum entweder eine Funktion in der 99_myUtils.pm einzubauen anstatt meiner Notify und/oder auf Perl Ebene, oder ?
Wenn ich es richtig verstehe bewege ich mit den Klammen "{ }" auf Perl ebenen und nicht im FHEM oder ?
Richtig, die Funktion - jetzt heißt sie isInTime ;) - kommt in die 99_myUtils.pm.
Aufgerufen wird sie dann im notify.
Falls Du noch keine 99_myUtils.pm hast, dann schau im Wiki nach... da findest Du eine Anleitung.
Und wieder richtig, zwischen den { } bewegst Du dich auf der Perl-Ebene.
Hallo Torsten,
Da es sich um eine Perlfunktion handelt musst Du auf Perlebene gehen. Das machst Du aus FHEM heraus in dem Du Deinen Code in { } setzt. Du kannst FHEM und Perlcode nicht vermischen. Du kannst aber FHEM Routinen auf Perlebene aufrufen.
Also den Code von isInTime einfach in eine 99_myUtils kopieren. Diese dann neu laden
reload 99_myUtils
und dann im Notify
WZ.Hub.currentActivity:.PowerOff { fhem('set LichtFlurSicherung on-for-timer 120; set Sonos_Kueche Speak 30 de Gute Nacht Schlaft schön ihr zwei; define Time1 at +00:01:00 set HUEGroup1 off') if( isInTime('22:00-24:00 00:00-04:00'); }
Riesen Dank euch !!!!
Mal ne Frage zu Perl innerhalb Notify
Ist dies kein Nachteil sozusagen auf zwei Ebenen zu sein ?
Meine sowas mal gelesen zu haben ?
Probiere den Code gleich mal aus. eine 99_myUtils hatte ich schon angelegt.
Mal sehen ;)
Grüße & Danke
Zitat von: TottiToad am 14 September 2017, 21:06:15
Riesen Dank euch !!!!
Mal ne Frage zu Perl innerhalb Notify
Ist dies kein Nachteil sozusagen auf zwei Ebenen zu sein ?
Meine sowas mal gelesen zu haben ?
Probiere den Code gleich mal aus. eine 99_myUtils hatte ich schon angelegt.
Mal sehen ;)
Grüße & Danke
Im Grunde ist alles Perl. Daher kein wirklicher Nachteil.
So nochmals Riesen Dank für die schnelle und Super Hilfe !
Es läuft perfekt !!!
Jetzt muss ich nur noch herausfinden warum WZ.Hub.currentActivity:.PowerOff beim ausschalten scheinbar dreimal gesendet wird und im event Monitor auftaucht.
Will ja nicht drei mal Gute Nach hören :) :) :)
Im Doif könntest du die mehrmalige Ausführung über Attribute verhindern.
Nur so nebenbei. 😉
Gesendet von meinem S3_32 mit Tapatalk
Schau mal ob du was mit event-on-change-reading oder so machen kannst.
notify unterstützt auch das Attribut disabled-for-intervals und lässt sich damit von 04:00 bis 22:00 Uhr ausschalten.
Also bei mir funktionietr das isTime nicht...
Zumindest die 2.Zeit gibt keinen Anruf, wenn die Tür geöffnet wird. Zwischen 8-9:30 klappt hingegen.
Internals:
DEF (SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.* { fhem ('set mySIP call +4917... 30 !Alarm Alarm Alarm') if (isInTime('08:00-09:30 09:45-06:00'));}
NAME UnautorisierteTueroeffnung.Alert
NR 1381
NTFY_ORDER 50-UnautorisierteTueroeffnung.Alert
REGEXP (SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.*
STATE 2020-10-26 09:50:19
TRIGGERTIME 1603702219.96481
TYPE notify
READINGS:
2020-10-26 09:20:53 state active
Attributes:
room Haus->Flur,Haus->Wohnzimmer,Status
Du musst es korrekt setzen. Es kann nur immer von 0 bis 24 Uhr und nicht übergreifend.
if (isInTime('08:00-09:30 09:45-24:00 00-06:00'));}
Hallo,
auf die Gefahr hin das ich irgendwas nicht verstanden habe.
Wozu dazu eine extra Funktion verwenden, wenn man es mit disabled-for-intervals angehen kann ?
Zitatnotify unterstützt auch das Attribut disabled-for-intervals und lässt sich damit von 04:00 bis 22:00 Uhr ausschalten.
Reicht nicht einfach eine Angabe von 04-22 in disabled-for-intervals ?
Gruß
Thomas
edit:
nicht richtig gelesen:
09:30-09:45 06-08
Mit der Zeitangabe klappt, wohlgemerkt, bin in der Ausprobierphase.
Jetzt wollte ich das Ganze in Abhängigkeit der Anwesenheit steuern. Bei present ruft mich fhem an mit Alarm, Alarm...
Meld ich mich hingegen ab und es steht absent im reading, hätte ich jetzt Test erwartet. Stattdessen kommt wieder nur Alarm, Alarm,...
(SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.*
{
fhem ('set mySIP call +4917... 30 !Test') if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "absent");
fhem ('set mySIP call +4917... 30 !Alarm Alarm Alarm') if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "present") and (isInTime('08:00-09:30 09:45-24:00 00-06:00'));
}
Zitat von: TomLee am 26 Oktober 2020, 10:51:14
Wozu dazu eine extra Funktion verwenden, wenn man es mit disabled-for-intervals angehen kann ?
Ich würde sowas auch über das Attribut disabledForIntervals lösen und die Abwesenheitsabfrage direkt in den Ausführungsteil packen.
defmod UnautorisierteTueroeffnung.Alert notify (SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.* { fhem ('set mySIP call +49[deleted_by_admin] 30 !Alarm Alarm Alarm') if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "present"); }
attr UnautorisierteTueroeffnung.Alert disabledForIntervals 09:30-09:45 06:00-08:00
Vielleicht kurz zum Hintergrund. Wenn ich Anwesend bin, soll quasi das notify als stiller Alarm fungieren und eine bestimmte Nummer anrufen. Wenn ich hingegen, Abwesend bin, soll mich fhem direkt anrufen.
Dann eigentlich nur den Perlteil um ein weiteres if mit dieser Bedingung erweitern:
defmod UnautorisierteTueroeffnung.Alert notify (SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.* { fhem ('set mySIP call +49[deleted_by_admin] 30 !Alarm Alarm Alarm') if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "present");
fhem ('dein Befehl für den Anruf') if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "absent")
}
attr UnautorisierteTueroeffnung.Alert disabledForIntervals 09:30-09:45 06:00-08:00
Zitat« Letzte Änderung: Heute um 13:25:48 von Martin Fischer »
Das ja lustig
Zitat von: TomLee am 26 Oktober 2020, 13:46:19
Dann eigentlich nur den Perlteil um ein weiteres if mit dieser Bedingung erweitern:
Nein, bitte nicht so. Das Konstrukt mit "if" hinter einer Anweisung sollte man nicht verwenden, wenn man mehrere Unterscheidungen treffen möchte.
Dafür sollte man dann schon dass in perl dafür vorgesehene komplette if.. else.. Konstrukt verwenden.
defmod UnautorisierteTueroeffnung.Alert notify (SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.* {
if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "present") {
fhem ('set mySIP call +49[deleted_by_admin] 30 !Alarm Alarm Alarm');
} else {
fhem ('dein Befehl für den Anruf');
}
}
Zitat von: TomLee am 26 Oktober 2020, 13:46:19
Das ja lustig
nein, das ist schon ok. Die Telefonnummer im Klartext zu entfernen macht schon Sinn.
Zitatfhem ('set mySIP call +49[deleted_by_admin] 30 !Alarm Alarm Alarm');
Jetzt habe ich herausgefunden, wie es geht....
(SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.* {
if (ReadingsVal('Smartphone_Anwesenheit','state','') eq 'present') {
fhem ('set mySIP call +4917... 30 !Alarm Present') if(isInTime('09:15-09:25'));
fhem ('set mySIP call +4917... 30 !Alarm at home') if(isInTime('09:00-09:10'));
} else {
fhem ('set mySIP call +4917... 30 !Test Absent');
}
}
Damit lässt sich dann Einiges realisieren. Das Script isInTime ist echt nen Mehrwert.
ZitatJetzt habe ich herausgefunden, wie es geht....
Nach einem Hinweis schon vor zwei Jahren und jetzt noch einmal (+ fertigem copy+paste-Beispiel), das es (auch noch kürzer) mit notify-Bordmiteln umzusetzen geht, ist es mir ein Rätsel weshalb du die Zeit lieber in das Verständnis der Funktion investiert hast, statt herauszufinden wie disabledForIntervals tickt (ich mein nicht anders) ?
Manchen Leuten kann man einfach nicht wirklich helfen.
Dann erklärt mir doch einfach, wie man mit der siabled Option diese Fallunterscheidung abbilden soll... Vielleicht kommt ja noch eine 3. oder 4. hinzu.
(SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.* {
if (ReadingsVal('Smartphone_Anwesenheit','state','') eq 'present') {
[b] fhem ('set mySIP call +4917... 30 !Alarm Present') if(isInTime('09:15-09:25'));
fhem ('set mySIP call +4917... 30 !Alarm at home') if(isInTime('09:00-09:10'));[/b]
} else {
fhem ('set mySIP call +4917... 30 !Test Absent');
}
}