FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: TottiToad am 14 September 2017, 20:29:42

Titel: Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: TottiToad am 14 September 2017, 20:29:42
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
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: kumue am 14 September 2017, 20:34:46
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)
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: CoolTux am 14 September 2017, 20:45:05
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')
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: TottiToad am 14 September 2017, 20:48:43
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
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: Frank_Huber am 14 September 2017, 20:53:39
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

Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: TottiToad am 14 September 2017, 20:54:05
@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
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: kumue am 14 September 2017, 20:58:26
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.
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: CoolTux am 14 September 2017, 21:02:24
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'); }
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag 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
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: CoolTux am 14 September 2017, 21:21:37
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.
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: TottiToad am 14 September 2017, 21:29:03
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 :) :) :)
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: Frank_Huber am 14 September 2017, 21:33:58
Im Doif könntest du die mehrmalige Ausführung über Attribute verhindern.
Nur so nebenbei. 😉

Gesendet von meinem S3_32 mit Tapatalk

Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: CoolTux am 14 September 2017, 21:40:48
Schau mal ob du was mit event-on-change-reading oder so machen kannst.
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: igami am 16 September 2017, 06:32:27
notify unterstützt auch das Attribut disabled-for-intervals und lässt sich damit von 04:00 bis 22:00 Uhr ausschalten.
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: en-trust am 26 Oktober 2020, 09:53:55
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
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: CoolTux am 26 Oktober 2020, 10:03:23
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'));}
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: TomLee am 26 Oktober 2020, 10:51:14
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
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: en-trust am 26 Oktober 2020, 11:08:57
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'));
}
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: betateilchen am 26 Oktober 2020, 12:52:58
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
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: en-trust am 26 Oktober 2020, 13:34:32
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.
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: TomLee am 26 Oktober 2020, 13:46:19
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
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: betateilchen am 26 Oktober 2020, 13:54:07
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');
  }
}

Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: betateilchen am 26 Oktober 2020, 14:01:16
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');
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: en-trust am 27 Oktober 2020, 09:19:01
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.
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: TomLee am 27 Oktober 2020, 12:26:31
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) ?
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: betateilchen am 27 Oktober 2020, 12:29:00
Manchen Leuten kann man einfach nicht wirklich helfen.
Titel: Antw:Notify zwischen 22-4 Uhr ? Wie Tagübergreifend ???
Beitrag von: en-trust am 28 Oktober 2020, 11:19:08
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');
  }
}