Hauptmenü

Ruhe in der Nacht

Begonnen von masterpete23, 06 Dezember 2017, 16:39:27

Vorheriges Thema - Nächstes Thema

masterpete23

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 !

kumue

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)

masterpete23

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

Fixel2012

Kannst natürlich um es einfacher zu halten das notify durch ein DOIF ersetzen.
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

CoolTux

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.
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

masterpete23

Ja so sehe ich das auch.
Wie mach ich das am besten - bin da noch ein bisschen neu drin :I

CoolTux

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?
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

masterpete23

sowas habe ich, aber nutze ich noch nicht komplett. Zeit würde mich reichen.
eine solche datei habe ich bisher nicht.

CoolTux

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

Per

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.

Tabularasa

@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

masterpete23

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

Per

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.

Tabularasa

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

Tabularasa

Servus. Kann mir jemand zu meinem letzten Post noch helfen?