FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: c.brinkmann am 10 Oktober 2017, 15:57:34

Titel: DOIF oder NOTIFY?
Beitrag von: c.brinkmann am 10 Oktober 2017, 15:57:34
Moin Moin!

Je größer meine Programme werden und je mehr ich meiner eigenen Kreativität freien Raum für neue Projekte lasse, kommt bei mir immer mehr die Frage über den Unterschied eines DOIF´s und einer NOTIFY.
Wenn man sich Projekte von anderen anguckt, wird meistens für jeden einzelnen Befehl ein eigenes Notify angelegt.
Ich habe hauptsächlich zwei DOIF´s mit denen ich größtenteils experimentiere. Unter anderem ist das die Tür. hier werden bei verschiedenen Tastendrücken, etc. die Tür gesteuert. (Sind in der Summe 33 cmd´s. Bis auf, dass jeder Befehl nur einmal hintereinander ausgeführt werden kann, erkenne ich keine Nachteile, bzw unterschiede zu einem Notify. Ich habe mich für ein einzelnes DOIF entschieden, da ich keine 33 eigene Programme haben wollte.

Nun meine Frage: kann mir jemand den Unterschied beider erklären, bzw. mir ein Tip geben, wo ich dieses herausfinden kann?

Gruß, Christian
Titel: Antw:DOIF oder NOTIFY?
Beitrag von: CoolTux am 10 Oktober 2017, 16:02:52
Das ist eher eine Glaubensfrage.
Und Umfangreiche Sachen macht man weder mit DOIF noch mit Notify sondern einzig in einer 99_myUtils. 33 CMD's da ist doch sicherlich jeglicher Überblick verloren gegangen.
Titel: Antw:DOIF oder NOTIFY?
Beitrag von: CoolTux am 10 Oktober 2017, 16:07:49
Hier mal was zum Thema Licht damit man mal sieht das man sowas nicht in ein Notify oder DOIF pressen kann.
Die komplette Lichtsteuerung erfolgt voll Automatisch. Die Lichtschalter sind so sauber als wären sie neu eingebaut  ;D



###### Wohnungslicht ################
sub autoLightControl() {

## Hilfsvariablen
my $adv = adv();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
my $lux = ReadingsVal('twilightStahnsdorf','lux',1000);

#### Helligkeitswert vom Pflanzensensor mit abfragen
fhem("set PflanzeFensterRechts statusRequest") if($hour > 04 and $hour < 23);
fhem("sleep 60; set PflanzeFensterLinks statusRequest") if($hour > 04 and $hour < 23);


########################
## Abends Licht an

    if( ((ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) < 55 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 24 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) > 6
          and ReadingsVal( "twilightStahnsdorf", "state", "100" ) < 11 ) or (ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 24 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) > 5
          and ReadingsVal( "twilightStahnsdorf", "state", "100" ) < 11))
        and (Value("dummyLgTV") eq "on" or ReadingsVal("Eltern","state","absent") eq "home") and $lux < 200 ) {

        if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" ) {
                if( $adv ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                    fhem "set lightScenenLicht_Media scene Twilight_7_WohnzimmerFlurWeihnacht";
                    fhem "set room=Weihnacht:FILTER=state=off on";
                } else {
                    fhem "set lightScenenLicht_Media scene Twilight_7_WohnzimmerFlur";
                    fhem "set room=Weihnacht:FILTER=state=off on" if( Value("dummyLichtWinter") eq "active" );
                }
        } else {
                if( $adv ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                    fhem "set lightScenenLicht_Media scene Twilight_7_WohnzimmerWeihnacht";
                    fhem "set room=Weihnacht:FILTER=state=off on";
                } else {
                    fhem "set lightScenenLicht_Media scene Twilight_7_Wohnzimmer";
                    fhem "set room=Weihnacht:FILTER=state=off on" if( Value("dummyLichtWinter") eq "active" );
                }
        }
           
            CommandSet(undef,"LichtDimmerStevenDeckenLampe_Sw:FILTER=pct=0 pct 50") if( Value("rr_Steven") eq "home" and $lux < 200 and Value('autoLichtsteuerungSteven') eq 'on' );
    }

    elsif( ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) < 66 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 24 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) > 6
     and ReadingsVal( "twilightStahnsdorf", "state", "100" ) < 10 and $lux < 300 ) {
    fhem "set LED_StreifenFlurDecke bri 254; set LED_StreifenFlurDecke hue 44444 : sat 90" if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" );
    }

    elsif( ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) < 66 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) == 6
     and ReadingsVal( "twilightStahnsdorf", "nextEvent", "ss_weather" ) eq "ss_weather" and $lux < 300) {
    fhem "set LED_StreifenFlurDecke bri 254; set LED_StreifenFlurDecke hue 44444 : sat 90" if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" );
    }
   
    ### Wenn die Eltern nicht zu Hause sind aber die Kinder
    elsif( ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) < 20 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) > 9
     and ReadingsVal("Eltern","state","home") ne "home" and ReadingsVal("Kinder","state","absent") eq "home" and $lux < 200 ) {
    fhem "set LED_StreifenFlurDecke bri 254; set LED_StreifenFlurDecke hue 44444 : sat 90" if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" and $hour < 20 );
        fhem "set LED_StreifenFlurDecke bri 100; set LED_StreifenFlurDecke hue 47104 : sat 254" if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" and $hour > 19 );
        fhem "set room=Weihnacht:FILTER=state=off on" if( $adv or Value("dummyLichtWinter") eq "active" );     ## Abfrage Adventszeit aus 99_myUtils_Helper
        CommandSet(undef,"LichtDimmerStevenDeckenLampe_Sw:FILTER=pct=0 pct 50") if( Value("rr_Steven") eq "home" and $lux < 200 and Value('autoLichtsteuerungSteven') eq 'on' );
    }

    elsif( $hour > 20 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) < 40 and $lux < 200 and (Value("dummyLgTV") eq "on" or
     ReadingsVal("Eltern","state","absent") eq "home") ) {
    if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" ) {
            if( $adv ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                fhem "set lightScenenLicht_Media scene Twilight_10_WohnzimmerFlurWeihnacht; set structureCandleFlur:FILTER=state=off on";
                fhem "set room=Weihnacht:FILTER=state=off on";
            } else {
                fhem "set lightScenenLicht_Media scene Twilight_10_WohnzimmerFlur; set structureCandleFlur:FILTER=state=off on";
                fhem "set room=Weihnacht:FILTER=state=off on" if( Value("dummyLichtWinter") eq "active" );
            }
    } else {
            if( $adv ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                fhem "set lightScenenLicht_Media scene Twilight_10_WohnzimmerWeihnacht";
                fhem "set room=Weihnacht:FILTER=state=off on";
            } else {
                fhem "set lightScenenLicht_Media scene Twilight_10_Wohnzimmer";
                fhem "set room=Weihnacht:FILTER=state=off on" if( Value("dummyLichtWinter") eq "active" );
            }
    }
    }

    elsif( $hour > 19 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) < 60 and $lux < 200 and (Value("dummyLgTV") eq "on" or
     ReadingsVal("Eltern","state","absent") eq "home") ) {
    if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" ) {
            if( $adv ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                fhem "set lightScenenLicht_Media scene Twilight_8_WohnzimmerFlurWeihnacht";
                fhem "set room=Weihnacht:FILTER=state=off on";
            } else {
                fhem "set lightScenenLicht_Media scene Twilight_8_WohnzimmerFlur";
                fhem "set room=Weihnacht:FILTER=state=off on" if( Value("dummyLichtWinter") eq "active" );
            }
    } else {
            if( $adv ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                fhem "set lightScenenLicht_Media scene Twilight_8_WohnzimmerWeihnacht";
                fhem "set room=Weihnacht:FILTER=state=off on";
            } else {
                fhem "set lightScenenLicht_Media scene Twilight_8_Wohnzimmer";
                fhem "set room=Weihnacht:FILTER=state=off on" if( Value("dummyLichtWinter") eq "active" );
            }
    }
    }


########################
## Abends Licht aus

    elsif( ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) < 66 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) > 5
     and Value("dummyLgTV") eq "off" and Value('structureLichtIsabelsZimmer') eq 'on' and ReadingsVal("Eltern","state","home") ne "home" ) {
    fhem "set structureLichtWohnzimmer [FILTER=STATE!=off] off" if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" );
    }


########################
## Morgens Licht aus

    elsif( ReadingsVal( "twilightStahnsdorf", "state", "100" ) == 4 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 55 and $lux > 200 and $lux < 500 ) {
    fhem "set (structureLichtWohnzimmer|NetzschalterKinZimIsabelHintenLinks):FILTER=STATE=on off; set group=Licht.Weihnachten:FILTER=state=on off";
        fhem "set group=Licht.Weihnachtsbaum:FILTER=state=on off" if( Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) ;
    }

    elsif( (ReadingsVal( "twilightStahnsdorf", "state", "100" ) == 5 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 54 and $lux > 200 and $lux < 300) or ($lux > 300 and $lux < 500) ) {
    fhem "set (structureLichtWohnzimmer|NetzschalterKinZimIsabelHintenLinks):FILTER=STATE=on off; set group=Licht.Weihnachten:FILTER=state=on off";
        fhem "set group=Licht.Weihnachtsbaum:FILTER=state=on off" if( Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) ;
    }

    elsif( (ReadingsVal( "twilightStahnsdorf", "state", "100" ) == 6 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 65 and $lux > 200 and $lux < 300) or ($lux > 300 and $lux < 700) ) {
        fhem "set (structureLichtWohnzimmer|structureLichtBadezimmer|NetzschalterKinZimIsabelHintenLinks):FILTER=STATE=on off; set group=Licht.Weihnachten:FILTER=state=on off";
        fhem "set group=Licht.Weihnachtsbaum:FILTER=state=on off" if( Value("dummyWeihnachtsbaumAutoOFF") eq "active" );
       
        if( (ReadingsVal( "twilightStahnsdorf", "elevation", "15" ) < 15 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 80 and $lux > 300 and $lux < 400) or ($lux > 400 and $lux < 700) ) {
            fhem "set LED_StreifenFlurDecke:FILTER=onoff=1 off" if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" );
        }
       
        elsif ( (ReadingsVal( "twilightStahnsdorf", "elevation", "15" ) > 15 and $lux > 300 and $lux < 400) or ($lux > 400 and $lux < 700) ) {
            fhem "set LED_StreifenFlurDecke:FILTER=onoff=1 off" if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" );
        }
    }
   
    elsif($lux > 250 and $lux < 700) {
        CommandSet(undef,"set LED_StreifenFlurDecke:FILTER=onoff=1 off") if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" and $lux > 500);
        CommandSet(undef,"LichtDimmerStevenDeckenLampe_Sw:FILTER=pct!=0 pct 0") if( Value("rr_Steven") eq "home" and $lux > 250 and Value('autoLichtsteuerungSteven') eq 'on' );
    }
}
Titel: Antw:DOIF oder NOTIFY?
Beitrag von: Beta-User am 10 Oktober 2017, 16:15:13
Hier (https://forum.fhem.de/index.php/topic,66830.0.html) gibt es eine größere Diskussion dazu.

notify gehört für mich wie at zur FHEM-Grundfunktionalität, DOIF ist mir mit seinen ganzen Attributen und deren Wechselwirkungen eher suspekt, deswegen versuche ich eher perl-code einzusetzen, wenn es mehr wie eine Abfrage nach einem Event ist (notify+perl-code)...
Und überhaupt nicht nachvollziehen kann ich es, wenn statt eines notify für immer dieselbe Reaktion auf ein Event ein DOIF mit "do always" eingesetzt wird.

Aber: jeder wie er mag ;) .

Gruß, Beta-User

@CoolTux: Wie wird die sub den aufgerufen?
Titel: Antw:DOIF oder NOTIFY?
Beitrag von: CoolTux am 10 Oktober 2017, 16:20:49
Zitat von: Beta-User am 10 Oktober 2017, 16:15:13
Hier (https://forum.fhem.de/index.php/topic,66830.0.html) gibt es eine größere Diskussion dazu.

notify gehört für mich wie at zur FHEM-Grundfunktionalität, DOIF ist mir mit seinen ganzen Attributen und deren Wechselwirkungen eher suspekt, deswegen versuche ich eher perl-code einzusetzen, wenn es mehr wie eine Abfrage nach einem Event ist (notify+perl-code)...
Und überhaupt nicht nachvollziehen kann ich es, wenn statt eines notify für immer dieselbe Reaktion auf ein Event ein DOIF mit "do always" eingesetzt wird.

Aber: jeder wie er mag ;) .

Gruß, Beta-User

@CoolTux: Wie wird die sub den aufgerufen?

Über ein Notify welches auf twilight:azimuth.* triggert und im noch 3 kleine Abfragen macht.
Titel: Antw:DOIF oder NOTIFY?
Beitrag von: betateilchen am 10 Oktober 2017, 16:35:30
oh... ein Popcorn-Thread... in welchem Umzugskarton hab ich bloß die Popcornmaschine verpackt *grübel*
Titel: Antw:DOIF oder NOTIFY?
Beitrag von: Frank_Huber am 10 Oktober 2017, 16:47:08
Zitat von: betateilchen am 10 Oktober 2017, 16:35:30
oh... ein Popcorn-Thread... in welchem Umzugskarton hab ich bloß die Popcornmaschine verpackt *grübel*
mein Gedanke.
ein Popcorn Thread. ;-)

meine 2 cent dazu:
ich nutze beides. für klare Aktionen wie "Wasser oder Rauchmelder löst aus --> mache etwas" nutze ich notify.
Alles was verzweigter ist mit mehreren Bedingungen nutze ich DOIF. finde ich persönlicher übersichtlicher und durch die ganzen Attribute flexibler.