FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: masterpete23 am 06 Dezember 2017, 16:39:27

Titel: Ruhe in der Nacht
Beitrag von: masterpete23 am 06 Dezember 2017, 16:39:27
Hi,

ich habe aus einem "Blog" einige Zeilen Code übernommen.
MIt der Revolt Steckdose die Meldung, dass Waschmaschine bzw. Trockner fertig sind.

Da dies ab und an in der Nacht ist und oder die Steckdose auch nicht immer sauber arbeitet, würde ich gerne eine "Ruhe in der Nacht" mitgeben.

Wo mache ich das am besten und wie?

ich habe 2 codevarianten gerade im Einsatz bin von beiden noch nicht überzeugt - wie füge ich da diese Sperrzeit von 23 - 6 UHr morgens ein?

define Trockner_Betrieb dummy
attr Trockner_Betrieb event-on-change-reading state

define Trockner_DI DOIF ([Revolt_Trockner:power]>5) (set Trockner_Betrieb on) DOELSEIF ([Revolt_Trockner:power]<4) (set Trockner_Betrieb off)
attr Trockner_DI wait 60:160

define Trockner_fertig_telegram notify Trockner_Betrieb:off set teleBot message Der TrocknerV2 ist fertig !


define Revolt_Trockner.AutoStandby watchdog Revolt_Trockner.HoherVerbrauch:off 00:03 Revolt_Trockner.HoherVerbrauch:on set Revolt_Trockner.Betrieb standby
attr Revolt_Trockner.AutoStandby icon scene_washing_machine
# Push-Notification bei abgeschlossenem Waschvorgang "Waschmaschine ist fertig"
define Revolt_Trockner.WaschvorgangAbgeschlossen.Telegram.notify notify Revolt_Trockner.Betrieb:standby set teleBot message Der Trockner ist fertig !
Titel: Antw:Ruhe in der Nacht
Beitrag von: kumue am 06 Dezember 2017, 16:47:16
bei dem DOIF könnte man eine Zeitabfrage in die Bedingung mit einbauen in der Art
([?06:00-23:00] and [Revolt_Trockner:power]>5)
Titel: Antw:Ruhe in der Nacht
Beitrag von: masterpete23 am 06 Dezember 2017, 19:49:12
Danke für den Tip.
Kann ich das auch direkt vor die Nachricht bringen, da ja der die anderen Werte eigentlich korrekt sind. GEht ja nur um das Absenden
Titel: Antw:Ruhe in der Nacht
Beitrag von: Fixel2012 am 06 Dezember 2017, 19:55:33
Kannst natürlich um es einfacher zu halten das notify durch ein DOIF ersetzen.
Titel: Antw:Ruhe in der Nacht
Beitrag von: CoolTux am 06 Dezember 2017, 20:00:10
Ich würde an der Zustandsschaltung nichts machen. Das DOIF also so lassen.
Ich würde besser bei der Meldung die Abfrage nach Uhrzeit verwenden.
Was bringt es Dir wenn die Zustände nicht korrekt abgebildet werden.
Titel: Antw:Ruhe in der Nacht
Beitrag von: masterpete23 am 06 Dezember 2017, 20:54:36
Ja so sehe ich das auch.
Wie mach ich das am besten - bin da noch ein bisschen neu drin :I
Titel: Antw:Ruhe in der Nacht
Beitrag von: CoolTux am 06 Dezember 2017, 21:18:15
Hast Du sowas wie ein Homemode Device? Am besten wäre das Residents Modul. Da stellt man dann ein schlafen oder weg oder so.
Oder eben nach Zeit. Dafür habe ich mir eine eigene 99_myUtils Sub geschrieben. Weist Du wie man sowas anlegt?
Titel: Antw:Ruhe in der Nacht
Beitrag von: masterpete23 am 06 Dezember 2017, 22:45:07
sowas habe ich, aber nutze ich noch nicht komplett. Zeit würde mich reichen.
eine solche datei habe ich bisher nicht.
Titel: Antw:Ruhe in der Nacht
Beitrag von: CoolTux am 06 Dezember 2017, 22:59:54
Du legst unter /opt/fhem/FHEM/
eine Datei an Namens 99_myUtils_Helper.pm
Der Besitzer ist fhem, also
chown fhem: 99_myUtils_Helper.pm

Und Rechte sind 755
chmod 755 99_myUtils_Helper.pm

Danach in FHEM in der Webkommandozeile
reload 99_myUtils_Helper.pm eingeben.

Danach kannst Du einfach abfragen

If( isInTime("07:00-21:00") ) {
Dann mache das
}



##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;
use HTTP::Date;



sub myUtils_Helper_Initialize($$) {

  my ($hash) = @_;

}

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


1;




Setze das erstmal um dann schauen wir weiter
Titel: Antw:Ruhe in der Nacht
Beitrag von: Per am 07 Dezember 2017, 12:17:01
Warum machst du überhaupt ein eigenes Device für das Absenden der Nachricht? Pack das doch mit in das DOIF?!
Und mit einem IF davor hast du auch Nachts Ruhe.
Titel: Antw:Ruhe in der Nacht
Beitrag von: Tabularasa am 07 Dezember 2017, 12:43:18
@Per kannst du bitte ein Beispiel für das IF geben? Habe nämlich eine ähnliche Situation aber weiß nicht wie ich das IF einsetzen muss. Danke

Falls das so allgemein nichts wird könnte ich mein DOIF auch nachher nochmal posten
Titel: Antw:Ruhe in der Nacht
Beitrag von: masterpete23 am 07 Dezember 2017, 13:07:27
Hier,
verstehe ich das richtig, dass ich dann die Sache "nur" in eine eigene Datei auslagere?

Zitat von: CoolTux am 06 Dezember 2017, 22:59:54
Du legst unter /opt/fhem/FHEM/
eine Datei an Namens 99_myUtils_Helper.pm
Der Besitzer ist fhem, also
chown fhem: 99_myUtils_Helper.pm

Und Rechte sind 755
chmod 755 99_myUtils_Helper.pm

Danach in FHEM in der Webkommandozeile
reload 99_myUtils_Helper.pm eingeben.

Danach kannst Du einfach abfragen

If( isInTime("07:00-21:00") ) {
Dann mache das
}



##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;
use HTTP::Date;



sub myUtils_Helper_Initialize($$) {

  my ($hash) = @_;

}

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


1;




Setze das erstmal um dann schauen wir weiter


Zitat von: Per am 07 Dezember 2017, 12:17:01
Warum machst du überhaupt ein eigenes Device für das Absenden der Nachricht? Pack das doch mit in das DOIF?!
Und mit einem IF davor hast du auch Nachts Ruhe.
wie gesagt habe das nur copy n paste gemacht - sorry
Titel: Antw:Ruhe in der Nacht
Beitrag von: Per am 07 Dezember 2017, 13:51:00
Zitat von: masterpete23 am 07 Dezember 2017, 13:07:27wie gesagt habe das nur copy n paste gemacht - sorry
Habe mir deinen Startpost nochmal angeschaut, da gibt es noch mehr Ungereimtheiten.

Wozu dient der Dummy? Nur um abzufragen, ob er geschaltet wurde, statt direkt das dort gewünschte Ergebnis zu erzielen?!
Ich glaube, du solltest erstmal ein "Lastenheft" im Klartext erstellen, bevor du was zusammenkopierst. Oder wie bei einer mathematischen Textaufgabe: Gegeben und gesucht.
Titel: Antw:Ruhe in der Nacht
Beitrag von: Tabularasa am 07 Dezember 2017, 19:20:05
Zitat von: Tabularasa am 07 Dezember 2017, 12:43:18
@Per kannst du bitte ein Beispiel für das IF geben? Habe nämlich eine ähnliche Situation aber weiß nicht wie ich das IF einsetzen muss. Danke

Falls das so allgemein nichts wird könnte ich mein DOIF auch nachher nochmal posten

So hier mal mein DOIF
Internals:
   DEF        ##beide aus
([Zw_UG_Trockner_Pwr:power]<=0.18) (set Telegram msg Trockner und Waschmaschine aus)
DOELSEIF
## Trockner fertig, Waschmaschine aus
([Zw_UG_Trockner_Pwr:power]<1.1) (set Telegram msg Trockner fertig, set TYPE=SONOSPLAYER:FILTER=presence=appeared Speak 50 de der Trockner ist fertig und kann entleert werden)
DOELSEIF
## Waschmaschine fertig, Trockner aus
([Zw_UG_Trockner_Pwr:power]>1.29 and [Zw_UG_Trockner_Pwr:power]<1.33)
(set Telegram msg Waschmaschine fertig, set TYPE=SONOSPLAYER:FILTER=presence=appeared Speak 50 de die Waschmaschine ist fertig und die Wäsche kann in den Trockner)
DOELSEIF
## Irgendwas läuft
([Zw_UG_Trockner_Pwr:power]>100)

Attributes:
   repeatcmd  0:1200:1200:0
   repeatsame 0:3:3:0


Im Moment sind es 2 Sonos Player, die aber eigentlich jeder unterschiedlich was ansagen sollen.
Was ich erreichen möchte:

- wenn das Haus nicht den Status "home" hat dann sollen die Sonos erst beim umschalten in den Status die Ansage durchgeben
- von 21-7 Uhr und Status "home"soll nur noch SonosWZ die Durchsage machen. Sonst erst wenn der Status wieder darauf wechselt

Was ich halt nicht weiß, ist, ob man die Befehle oder Ausfühungen irgendwie trennen muss, oder Zeiten in die Attribute einfügen kann, oder IF irgendwo benutzt werden kann.
Telegram kann ruhig immer senden.

Dafür würde ich ein bisschen Starthilfe benötigen. Danke
Titel: Antw:Ruhe in der Nacht
Beitrag von: Tabularasa am 22 Dezember 2017, 22:00:17
Servus. Kann mir jemand zu meinem letzten Post noch helfen?
Titel: Antw:Ruhe in der Nacht
Beitrag von: Ellert am 23 Dezember 2017, 06:36:57
Zitat von: Tabularasa am 22 Dezember 2017, 22:00:17
Servus. Kann mir jemand zu meinem letzten Post noch helfen?

zu: Was ich halt nicht weiß, ist, ob man die Befehle oder Ausfühungen irgendwie trennen muss, oder Zeiten in die Attribute einfügen kann, oder IF irgendwo benutzt werden kann.

Ich wüsste nicht wie man "Befehle oder Ausfühungen" trennen kann, einem Befehl folgt immer dessen Ausführung.
Man kann Zeiten in Attribute einfügen, welche Attribute dazu geeignet sind geht aus der Commandref hervor.
"IF" ist ein Befehl und kann immer dort verwendet werden, wo eine Befehlsangabe erlaubt ist. Im DOIF ist dies der Ausführungsteil.