[Gelöst] notify - an bestimmten Tag zur bestimmen Uhrzeit ausschließen

Begonnen von Depechem, 07 September 2017, 09:02:41

Vorheriges Thema - Nächstes Thema

Depechem

Hi,
ich möchte gern ein für mich umfangreiches "notify" erstellen.

Was soll geschehen:
wenn DME_Kontakt:closed und es NICHT Mittwochs zwischen 17:55-18:05 Uhr
soll folgendes augelößt werden: set Hoftor on sowie immer zwischen 22:00-05:00 zusätzlich set Lampe1 on

wie muss das ganze dann zusammengebaut aussehen? Ich hänge an dem Ausschließen eines bestimmten Tages sowie Uhrzeit und an der zweiten Auslösung die nur zur einer bestimmen Uhrzeit mit erfolgen soll. Oder muss ich da mehrere notifys bauen.

Eigentlich wollte ich sogar noch einen Googlekalender prüfen(also ob ich arbeiten oder zuhause bin) aber das wird im Moment zu viel.

Viele Grüße Thomas
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

betateilchen

Das ist kein "umfangreiches notify" sondern pillepalle.

Bau Dir eine Funktion in der 99_myUtils.pm die Du aus dem notify aufrufst.
In dieser Funktion kannst Du Fallunterscheidungen einbauen, soviele Du willst. Und es bleibt auch nach vier Wochen noch nachvollziehbar, ganz im Gegensatz zu Romanen in der notify-Definition selbst.

Hier mal ein Beispiel aus meiner 99_myUtils.pm. Diese Funktion wird einmal pro Minute aufgerufen.


sub n_minuteJobs($$) {
my ($h,$m) = @_;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

# do jobs every minute
my $logpath = AttrVal('global','logdir','./log/');
$logpath .= "/fhem.heartbeat";
# Debug $logpath;
qx(touch $logpath);

# do jobs all 3 min
if(!($m % 3)) {
addLog("out_Regen_Rain", "state");
addLog("GW1__Warnung", "state");
}

# do jobs all 10 min
if(!($m % 10)) {
CommandGet(undef,'gds rereadcfg');
}

# do jobs all 30 min
if(!($m % 30)) {
        # nothing to do
}

# do jobs hourly
if(!($m)) {
addLog("out_Balkon", "state");
WriteStatefile;

my $off = 22;
CommandSet(undef,'wz_TC_Climate desired-temp 19.0') if ($hour == $off);

# $off++ if ($mon >= 4 && $mon < 9);
$off++ if ($isdst && $yday < 250);
CommandSet(undef,'Licht_Balkon off') if ($hour == $off);

if(!($h)) {
# do jobs at midnight
CommandSet(undef,'wz_Licht_Regal off');
CommandSet(undef,'Logfile reopen');
CommandSet(undef,'heizperiode $month');

my $d = sprintf("%02d.%02d.%04d", $mday, $mon+1, $year+1900);
CommandSetReading(undef,"global panelDatum $d");
}
}
return;
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

#2

define notifyDepechem notify DME_Kontakt:closed {

            #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);           # sollte in einem Notify eigentlich nicht nötig sein

            fhem('set Hoftor on') if( $wday == 3 and $hour > 16 and $min > 54 and $hour < 19 and $min < 6 );
            fhem('set Hoftor on') if( $hour < 4 and $hour > 21 );
}


Mit der Minute kleiner 6 bin ich mir unsicher. 06 wäre aber schon komisch.
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

betateilchen

Zitat von: CoolTux am 07 September 2017, 09:10:15

and $min > 54 ... and $min < 6


Nenne mir bitte eine Zahl, die größer ist als 54 und gleichzeitig kleiner als 6

(Popcorn?)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

#4
Jupp hast Recht. Ist doof
Neuer Versuch durch zu Hilfename einer kleinen geklauten Hilfsfunktion

99_myUtils

sub isTime($) {

    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 0 if($from le $dhms && $dhms le $to);
      }
    }
   
    return 1;
}

Noch ungetestet



define notifyDepechem notify DME_Kontakt:closed {

            #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);           # sollte in einem Notify eigentlich nicht nötig sein

            fhem('set Hoftor on') if( $wday == 3 and isTime('17:55-18:05') );
            fhem('set Hoftor on') if( isTime('21:00-04:00') );
}



Da mich das auch interessiert teste ich es gleich mal
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

Depechem

Zitat von: CoolTux am 07 September 2017, 09:50:31
Jupp hast Recht. Ist doof
Neuer Versuch durch zu Hilfename einer kleinen geklauten Hilfsfunktion

99_myUtils

sub isTime($) {

    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 0 if($from le $dhms && $dhms le $to);
      }
    }
   
    return 1;
}

Noch ungetestet



define notifyDepechem notify DME_Kontakt:closed {

            #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);           # sollte in einem Notify eigentlich nicht nötig sein

            fhem('set Hoftor on') if( $wday == 3 and isTime('17:55-18:05') );
            fhem('set Hoftor on') if( isTime('21:00-04:00') );
}



Da mich das auch interessiert teste ich es gleich mal

Super Grundlegend funktioniert dies.
Nur ist dies ja jetzt die Routine das set Hoftor on nur am Tag 3 zw. 17:55-18:05 funktioniert, aber es soll ja genau umgedreht sein:
set Hoftor on am Tag 3 zw. 17:55-18:05 NICHT auslösen, sonst immer

RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

CoolTux

#6
Hatte noch Fehler im return


sub isTime($) {

    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;
}

So funktioniert es nun korrekt

Und nun zum Notify

define notifyDepechem notify DME_Kontakt:closed {

            #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);           # sollte in einem Notify eigentlich nicht nötig sein

            fhem('set Hoftor on') if( $wday != 3 or ($wday == 3 and ! isTime('17:55-18:05')) );
            fhem('set Hoftor on') if( isTime('21:00-04:00') );
}


So und jetzt nehme ich bitte ein bisschen Popcorn. So früh am Morgen denken macht müde.

@Udo
Hast Du Zeit und Lust kurz ein zweites Beispiel zu bringen? Es gibt sicherlich noch eine einfachere Lösung. Also weniger Code.
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

CoolTux

Habe das Notify noch mal angepasst. Auf meinem Testsystem rennt es nun genau so wie Du es wolltest.
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

Depechem

Danke Leon, es funktioniert fast genau so wie gewünscht.

nur soll: fhem('set Hoftor on') if( isTime('21:00-04:00') ); auch nicht Mittwochs zw. 17:55-18:05 Uhr angehen.

Also die Routine so das:
Notify NIE Mittwochs zw. 17:55-18:05 Uhr auslößt, sonst immer set Hoftor on sowie zusätzlich fhem('set Hoftor2 on') if( isTime('21:00-04:00') ) < Aber auch nicht Mittwochs in zw. 17:55-18:05 Uhr.
Verstehst?
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

CoolTux

Oh man das mit dem verstehen ist so eine Sache  ;D
Sehe auch gerade das ich ja eh Mist gemacht habe, das zweite war ja eine Lampe. Ich lese jetzt noch mal gaaanz genau und versuche es dann noch einmal.
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

Depechem

Zitat von: CoolTux am 07 September 2017, 10:57:15
Oh man das mit dem verstehen ist so eine Sache  ;D
Sehe auch gerade das ich ja eh Mist gemacht habe, das zweite war ja eine Lampe. Ich lese jetzt noch mal gaaanz genau und versuche es dann noch einmal.

:-*
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

CoolTux


define notifyDepechem notify DME_Kontakt:closed {

            #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);           # sollte in einem Notify eigentlich nicht nötig sein

            fhem('set Hoftor on') if( $wday != 3 or ($wday == 3 and ! isTime('17:55-18:05')) );
            fhem('set Lampe1 on') if( isTime('21:00-04:00') );
}

Also laut Deiner Beschreibung geht nun IMMER Hoftor auf AUSSER Mittwoch zwischen 17:55 und 18:05 ausserdem geht (IMMER ZWISCHEN) 21:00-04:00 Uhr die Lampe an.


Ist das für so einen Feuerwehrmelder, wenn Einsatzmeldung kommt dann los ausser Mittwoch um 18 Uhr da ist Probealarm?
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

Depechem

Zitat von: CoolTux am 07 September 2017, 11:04:00

define notifyDepechem notify DME_Kontakt:closed {

            #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);           # sollte in einem Notify eigentlich nicht nötig sein

            fhem('set Hoftor on') if( $wday != 3 or ($wday == 3 and ! isTime('17:55-18:05')) );
            fhem('set Lampe1 on') if( isTime('21:00-04:00') );
}

Also laut Deiner Beschreibung get nun IMMER Hoftor auf AUSSER Mittwoch zwischen 17:55 und 18:05 ausserdem geht (IMMER ZWISCHEN) 21:00-04:00 Uhr die Lampe an.

Lampe soll nur zw. 21:00-04:00 Uhr angehen, aber auch nicht  "Mittwoch zwischen 17:55 und 18:05" < da Probealarm

Zitat von: CoolTux am 07 September 2017, 11:04:00
Ist das für so einen Feuerwehrmelder, wenn Einsatzmeldung kommt dann los ausser Mittwoch um 18 Uhr da ist Probealarm?
Ja genau  ;)
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

CoolTux

Die Lampe kann am Mittwoch ja gar nicht zwischen 7:55-18:05 angehen, da wir ja schon sagen sie soll nur zwischen 21:00-04:00 angehen. Das passt also. Kannst das letzte Notify nehmen.
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

Depechem

Zitat von: CoolTux am 07 September 2017, 11:08:12
Die Lampe kann am Mittwoch ja gar nicht zwischen 7:55-18:05 angehen, da wir ja schon sagen sie soll nur zwischen 21:00-04:00 angehen. Das passt also. Kannst das letzte Notify nehmen.

Na ich bin ja blöd  ::) stimmt  :D

VIEELEN DANK wiedereinmal mehr.
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...