Funktion im Hintergrund laufen lassen vs Event basiertes Konzept

Begonnen von ftsinuglarity, 16 März 2018, 12:54:07

Vorheriges Thema - Nächstes Thema

ftsinuglarity

Hallo liebe Gemeinde,

ich hoffe, ich greife kein schon abgehandeltes Thema auf, hab nicht wirklich etwas passendes gefunden.

Die Frage ist vlt leicht zu beantworten:
Wie bekomme ich eine Funktion (*.pm) so aufgerufen, das sie non-blocking im Hintergrund läuft, inklusive der Funktionen, die von ihr aufgerufen werden?

Sinn und Zweck:
Die Funktion wird alle x Minuten aufgerufen, und checkt verschiedene Zustände, schaltet Lichter und Geräte automatisiert. zB das Licht in der ganzen Wohnung aus, wenn vom Nacht zum Tagesmodus gewechselt wird. Soweit normal.
Die Funktion block natürlich, solange sie gerade läuft.
In der Auswirkung kann ich dann zb nicht per Fernbedinung die Anlage anschalten. Ist nicht schlimm, würde mir smoother aber besser gefallen.

Die Frage ist so allgemein, bitte nicht gleich wieder dafür verdammen. Ich hab nur grad keine Idee, wie ich das als Beispiel und Codeauszug demonstrieren soll. Eigentlich gehts mir um die Theorie. Ich reich aber gern alles nach, was benötigt wird.

marvin78

Da du nichts wirklich konkretes anbietest, auch nur eine allgemeine Antwort:

https://wiki.fhem.de/wiki/Blocking_Call

justme1968

#2
wenn du als endanwender so etwas über BlockingCall lösen musst machst du ziemlich sicher etwas falsch oder hast nicht verstanden das fhem event basiert arbeitet. es gibt so gut wie nie grund blockierend zu warten.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

marvin78

Deshalb mein Hinweise auf etwas konkretes. Man weiß nicht, was der User tut.

justme1968

der kommentar war auch nicht für dich sondern für ihn :)
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

ftsinuglarity

Zitat von: marvin78 am 16 März 2018, 12:56:29
Da du nichts wirklich konkretes anbietest, auch nur eine allgemeine Antwort:
https://wiki.fhem.de/wiki/Blocking_Call
Danke Marvin. Darüber bin ich auch schon gestolpert.
Ich bin noch nicht dazu gekommen zu testen, sieht für einen Schnellversuch ziemlich komplex aus.

Sagt folgender Auszug aus, das Settings, sagen wir gesetzte Werte in Dummies, Readings, letztendlich nicht in FHEM ankommen ? (schlecht ausgedrückt, ich hoffe du verstehst was ich meine)
Zitathttps://wiki.fhem.de/wiki/Blocking_Call
Veränderungen an internen Variablen von FHEM (Device Hashes, Timers, usw.) werden innerhalb eines BlockingCalls durchgeführt und sind dort auch sichtbar, haben aber keinerlei Einfluss auf den eigentlichen FHEM Hauptprozess und alle Definitionen


ftsinuglarity

#6
Zitat von: justme1968 am 16 März 2018, 12:59:57
wenn du als endanwender so etwas über BlockingCall lösen musst machst du ziemlich sicher etwas falsch oder hast nicht verstanden das fhem event basiert arbeitet. es gibt so gut wie nie grund blockierend zu warten.

Ehrlich gesagt hab ich mich gefragt, wie ich FHEM als Ganzes angehe.
Eventbasiet .. klar. Ereignis A wird getriggert, und ensprechend auf dieses eine Event reagiert.
Es reichte ziemlich schnell nicht mehr aus das nur über Notifies, at's und sonstiges zu machen, Codes wiederholten sich .. also macht eine Funktion Sinn, die dann von den einzelnen Events aufgerufen wird.

Mittlerweile  sind daraus mehrere komplexe Funktionen entstanden, die im Durchlauf ihre Zeit brauchen.
Die am meisten betroffene Funktion, um mal irgendwie konkret zu werden, ist eine, die quasi als Heartbeat in regelmäßigen Abständen checkt, ob Lichter an-oder auszuschalten sind (Tages- /Nachtmodus zB), Geräte ein- oder ausgeschaltet werden müssen .. sowas.

Ich versuche das mal in rudimentärem Code:

Ein Timer wird definiert, der alle 10 Minuten die Funktion Heartbeat aufruft:
defmod atHeartbeat at +*00:10:00 {Heartbeat()}

Die Funktion Heartbeat() :

sub Heartbeat {

    if(is_reboot()) {return 0;}

    # Herzschrittmacher
    my $at_time = substr(InternalVal("atHeartbeat","TIMESPEC","00:30:00"),3,2);
    $at_time = $at_time + 2;
    fhem("    sleep 2;
            defmod atPeacemaker at +*00:$at_time:00 {Heartbeat()};
            attr atPeacemaker room - Timer;
            attr atPeacemaker icon Wecker.Immer;
    ");
    set_reboot_counter("0"); # Reboot Counter Check
    Times();  # NightTime (+Readings)
    refresh_fhem_data(); # triggert Devices zum Refresh

   
    my $STATUS_HOME = "STATUS_HOME";
    if(Value("stP_Daniel") eq "absent" && Value("stP_Guests") eq "absent" && Value("dPresence_OnOff") eq "on") {
        fhem("set ".$STATUS_HOME." AWAY;");
    }
     else { fhem("trigger ".$STATUS_HOME." ".Value("STATUS_HOME")); }
   
    # Heizung
    if(ccu_alive()) { periodical_heater_settings(Value("STATUS_HOME")); }
}


Hier werden 2 große Funktionen aufgerufen bzw angetriggert (ganz unten):
fhem("set ".$STATUS_HOME." AWAY;");  => hiermit mache ich weiter untern
periodical_heater_settings(Value("STATUS_HOME")); => Heizung überwachen



set ".$STATUS_HOME." AWAY;"
Hier wird der DUMMY STATUS_HOME auf AWAY gesetzt. Dessen Notify nHOME:
defmod nHOME notify STATUS_HOME:(HOME|AWAY|SLEEP|URLAUB) {
    if(OldValue("STATUS_HOME") ne $EVENT ) {fhem(setHomeStatus($EVENT));}
    else {fhem(periodical_HOME_settings($EVENT));}
}

Wenn STATUS_HOME vorher auf zb HOME stand, wird jetzt die Funktion:
sub setHomeStatus($) { .. }
.. andernfalls
sub periodical_HOME_settings($) { .. }
aufgerufen.

sub setHomeStatus($) setzt einiges, was beim Wechsel der STATUS_HOME Zustände einmalig ist, und ruft dann letztlich auch sub periodical_HOME_settings($) auf.
Und diese Funktion ist etwas langatmiger .. checkt mehr oder weniger die ganze Wohnung. Was seine Zeit braucht.


Ich wollte verdeutlichen, wie Funktionen hier ineinandergreifen, und warum sie Zeit brauchen. Zumindest die periodical_HOME_settings würde ich gern in den Hintergrund legen, inkls. der Unterfunktionen.
Wenn ich den Ausschnitt aus Blocking Call richtig verstanden habe, funktioniert das Setzen von Readings etc aber nicht letztlich, also der geforkte Prozess kann nichts im Hauptprozess modifizieren (oder so ähnlich) ?

Vielleicht bin ich auch noch zu sehr der "alten" Programierweise verhaftet. Würdet ihr dieses Herangehen als No-Go bezeichnen und das nicht so zentral in so große Funktionen auslagern?
Oder passt das und müßte jetzt noch in den Hintergrund gepackt werden, damit es smooth läuft ?


Edit:
https://wiki.fhem.de/wiki/Blocking_Call
Solche Veränderungen müssen an die finishFn delegiert werden (z.B. durch zusätzliche Rückgabewerte), da es sich um einen Fork-Prozess handelt, der sich nach Abschluss des BlockingCall selbst zerstört.

Ok, geht dann doch, aber nicht direkt
Ich hatte auf etwas Unix artiges (einfaches) gehofft. À la call_functionX "Y"  & . So einfach wirds wohl nicht machbar sein ?


CoolTux

Ohne genau zu wissen wieso und für was kann ich Dir jetzt schon sagen das dies Unsinn und am Prinzip einer Hausautomatisierung vorbei ist. Wenn du so was machen willst brauchst du FHEM nicht.
Was ich sehen konnte war ne Menge Zeug an FHEM vorbei, ausser Timer Sachen und am Ende ein Dummy setzen oder so.

Warum??
Für was??


Bleibe beim Prinzip Event. Wieso sollte abgefragt werden wenn das Licht ausgehen soll. Denke anders, ein Ereignis tritt ein und dann soll das Licht ausgehen.
Du kommst nach Hause und z.B. per Bluetooth wird erkannt das Du da bist. Deswegen wird geprüft ob es dunkel ist und wenn ja soll Licht an gehen. Es soll deswegen weil du zu Hause bist und der erste bist der zu Hause ist die Heizung höher gedreht werden sofern die Wunschtemperatur noch nicht eingestellt ist.
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

ftsinuglarity

Zitat von: CoolTux am 16 März 2018, 17:22:33
Ohne genau zu wissen wieso und für was kann ich Dir jetzt schon sagen das dies Unsinn und am Prinzip einer Hausautomatisierung vorbei ist. Wenn du so was machen willst brauchst du FHEM nicht.
Was ich sehen konnte war ne Menge Zeug an FHEM vorbei, ausser Timer Sachen und am Ende ein Dummy setzen oder so.

Warum??
Für was??
Für was, bzw wie ich mir das vorgestellt habe (und es aktuell läuft), hatte ich ja gesagt.

Zitat von: CoolTux am 16 März 2018, 17:22:33
Bleibe beim Prinzip Event. Wieso sollte abgefragt werden wenn das Licht ausgehen soll. Denke anders, ein Ereignis tritt ein und dann soll das Licht ausgehen.
Ich habs befürchtet das ich da am Prinzip vorbei arbeite.
Wird das nicht schrecklich .. redundant? Überall ähnliche Codefragmente ? Schwer den Überblick zu behalten ?

So wars bei mir nach 'ner Zeit, weswegen ich dann auf zusammenfassende Funktionen ausgewichen bin. Inzwischen ist das aber so aufgebläht und hat auch so seine eigenen Tücken, das hier irgendwas prinzipiell schief läuft. Deswegen danke für dein Wort.


Zitat von: CoolTux am 16 März 2018, 17:22:33
Du kommst nach Hause und z.B. per Bluetooth wird erkannt das Du da bist. Deswegen wird geprüft ob es dunkel ist und wenn ja soll Licht an gehen. Es soll deswegen weil du zu Hause bist und der erste bist der zu Hause ist die Heizung höher gedreht werden sofern die Wunschtemperatur noch nicht eingestellt ist.
Ja

ftsinuglarity

#9
Wie schafft ihr es, bei der Fülle von Events, Devices, Notifies, at's, watchdogs und was es alles gibt, den Überblick zu behalten ?
Mit Struckturen kann man einiges zusammenfassen zB. Gegen kurze Codefragmente für sich ständig wiederholende Sachen auf myUtils.pm Funktionen auszuweichen ist auch legitim.
Möglichst eindeutige Bezeichnungsmuster (der Devices) helfen ebenfalls beim Überblick.

Gibt es irgenetwas dazu zu sagen, wie ihr das haltet ?


@CoolTux: Vermutlich hast du recht, und es ist eigentlich eher eine Frage der Herangehensweise, Denkweise. Vieles ergibt sich dadurch automatisch. Ich machs mir wahrscheinlich mal wieder komplizierter als es ist -> meine special Fähigkeit

CoolTux

Es nicht zu übertreiben  ;D
Ich habe auch so gut wie fast alles automatisiert, dennoch bilde ich mir ein das sich meine notifys und watchdogs in Grenzen halen. myUtils Routinen haba ich, aber ich Teile sie zum Beispiel in unterschiedliche myUtils Dateien auf.

./FHEM/99_myUtils_HeatingControl.pm
./FHEM/99_myUtils_Helper.pm
./FHEM/99_myUtils_HomeMode.pm
./FHEM/99_myUtils_InterComm.pm
./FHEM/99_myUtils_LightControl.pm
./FHEM/99_myUtils_MultiroomRadio.pm
./FHEM/99_myUtils_OLED_WandTaster.pm
./FHEM/99_myUtils_SystemCommands.pm
./FHEM/99_myUtils_Timer.pm
./FHEM/99_myUtils_Warnungen.pm
./FHEM/99_myUtils_ZufallsTexteTTS.pm


In welcher myUtils welche Sub ist ist eigentlich fast ersichtlich, dennoch schreibe ich das in das notify oder in den watchdog als comment wo sich die sub befindet.
Nichts desto trotz ist minimalistisches denken vielleicht doch Punkt nummer eins  :)

Zitat
Die am meisten betroffene Funktion, um mal irgendwie konkret zu werden, ist eine, die quasi als Heartbeat in regelmäßigen Abständen checkt, ob Lichter an-oder auszuschalten sind (Tages- /Nachtmodus zB), Geräte ein- oder ausgeschaltet werden müssen .. sowas.

Ich bilde mir ein so was ähnliches zu haben.

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

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

#### Helligkeitswert vom Pflanzensensor mit abfragen
CommandGet(undef,"PflanzenSensor3 sensorData") if($hour > 04 and $hour < 23);
fhem("sleep 60; get PflanzenSensor2 sensorData") if($hour > 04 and $hour < 23);


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

    if( ((ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) < 75 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 and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                    CommandSet(undef,'lightScenenLicht_Media scene Twilight_7_WohnzimmerFlurWeihnacht');
                    CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
                } else {
                    CommandSet(undef,'lightScenenLicht_Media scene Twilight_7_WohnzimmerFlur');
                    CommandSet(undef,'room=Weihnacht:FILTER=state=off on') if( Value("dummyLichtWinter") eq "active" );
                }
        } else {
                if( $adv and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                    CommandSet(undef,'lightScenenLicht_Media scene Twilight_7_WohnzimmerWeihnacht');
                    CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
                } else {
                    CommandSet(undef,'lightScenenLicht_Media scene Twilight_7_Wohnzimmer');
                    CommandSet(undef,'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" ) < 85 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 24 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) > 6
     and ReadingsVal( "twilightStahnsdorf", "state", "100" ) < 10 and $lux < 250 ) {
    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" ) < 85 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) == 6
     and ReadingsVal( "twilightStahnsdorf", "nextEvent", "ss_weather" ) eq "ss_weather" and $lux < 250 ) {
    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" ) < 55 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 );
        CommandSet(undef,'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" ) < 45 and $lux < 200 and (Value("dummyLgTV") eq "on" or
     ReadingsVal("Eltern","state","absent") eq "home") ) {
    if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" ) {
            if( $adv and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_10_WohnzimmerFlurWeihnacht');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
            } else {
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_10_WohnzimmerFlur');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on') if( Value("dummyLichtWinter") eq "active" );
            }
    } else {
            if( $adv and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_10_WohnzimmerWeihnacht');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
            } else {
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_10_Wohnzimmer');
                CommandSet(undef,'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 and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_8_WohnzimmerFlurWeihnacht');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
            } else {
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_8_WohnzimmerFlur');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on') if( Value("dummyLichtWinter") eq "active" );
            }
    } else {
            if( $adv and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_8_WohnzimmerWeihnacht');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
            } else {
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_8_Wohnzimmer');
                CommandSet(undef,'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" ) {
    CommandSet(undef,'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');
        CommandSet(undef,'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 < 400 ) {
    fhem('set (structureLichtWohnzimmer|NetzschalterKinZimIsabelHintenLinks):FILTER=STATE=on off; set group=Licht.Weihnachten:FILTER=state=on off');
        CommandSet(undef,'group=Licht.Weihnachtsbaum:FILTER=state=on off') if( Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) ;
       
        CommandSet(undef,'LED_StreifenFlurDecke:FILTER=onoff=1 off') if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" and $lux > 300);
        CommandSet(undef,'LichtDimmerStevenDeckenLampe_Sw:FILTER=pct!=0 off') if( Value("rr_Steven") eq "home" and $lux > 250 and Value('autoLichtsteuerungSteven') eq 'on' );
    }

    elsif( ReadingsVal( "twilightStahnsdorf", "state", "100" ) == 6 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 75 or ($lux > 300 and $lux < 700) ) {
        fhem('set (structureLichtWohnzimmer|structureLichtBadezimmer|NetzschalterKinZimIsabelHintenLinks):FILTER=STATE=on off; set group=Licht.Weihnachten:FILTER=state=on off');
        CommandSet(undef,'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 < 700 ) {
            CommandSet(undef,'LED_StreifenFlurDecke:FILTER=onoff=1 off') if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" );
        }
       
        elsif ( ReadingsVal( "twilightStahnsdorf", "elevation", "15" ) > 15 and $lux > 400 and $lux < 800 ) {
            CommandSet(undef,'LED_StreifenFlurDecke:FILTER=onoff=1 off') if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" );
        }
       
        CommandSet(undef,'LED_StreifenFlurDecke:FILTER=onoff=1 off') if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" and $lux > 500);
        CommandSet(undef,'LichtDimmerStevenDeckenLampe_Sw:FILTER=pct!=0 off') if( Value("rr_Steven") eq "home" and $lux > 250 and Value('autoLichtsteuerungSteven') eq 'on' );
    }
}


Die Sub wird folgendermaßen ausgeführt

Internals:
   CFGFN     
   DEF        twilightStahnsdorf:azimuth:.*   {
                                    if( Value( "AnniKraussStr" ) eq "home" and Value( "autoBeleuchtungDummy" ) eq "on" ) {
                                        autoLightControl();
                                    }
                                }
   NAME       notifyLightControl
   NOTIFYDEV  twilightStahnsdorf
   NR         178
   NTFY_ORDER 50-notifyLightControl
   REGEXP     twilightStahnsdorf:azimuth:.*
   STATE      2018-03-16 18:17:45
   TYPE       notify
   READINGS:
     2018-03-11 17:49:50   state           active
Attributes:


Vielleicht hilft es als kleines Beispiel.
Wie Du siehst lohnt es sich nur zu prüfen ob Licht angemacht werden soll, wenn sich auch die äußeren Lichtverhältnisse ändern. Dafür muss ich aber nicht immer irgendwas prüfen. In meinem Fall trigger ich den verlauf der Sonne und erst dann wird geprüft. Das sind hier ms die dafür benötigt 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

ftsinuglarity

#11
Zitat von: CoolTux am 16 März 2018, 18:23:34
Es nicht zu übertreiben  ;D
Ich habe auch so gut wie fast alles automatisiert, dennoch bilde ich mir ein das sich meine notifys und watchdogs in Grenzen halen. myUtils Routinen haba ich, aber ich Teile sie zum Beispiel in unterschiedliche myUtils Dateien auf.

./FHEM/99_myUtils_HeatingControl.pm
./FHEM/99_myUtils_Helper.pm
./FHEM/99_myUtils_HomeMode.pm
./FHEM/99_myUtils_InterComm.pm
./FHEM/99_myUtils_LightControl.pm
./FHEM/99_myUtils_MultiroomRadio.pm
./FHEM/99_myUtils_OLED_WandTaster.pm
./FHEM/99_myUtils_SystemCommands.pm
./FHEM/99_myUtils_Timer.pm
./FHEM/99_myUtils_Warnungen.pm
./FHEM/99_myUtils_ZufallsTexteTTS.pm


Jo. Sieht bei mir so aus :)
-rw-rw---- 1 pi dialout  19K Mär 15 02:29 99_Common_functions_Utils.pm
-rw-rw---- 1 pi dialout 1,9K Mär 11 19:53 99_Config_Utils.pm
-rw-rw---- 1 pi dialout 7,9K Mär 12 14:51 99_FHEM_Init_Utils.pm
-rw-rw---- 1 pi dialout  575 Mär 14 23:49 99_Guests_Utils.pm
-rw-rw---- 1 pi dialout 7,3K Mär 15 16:38 99_Heartbeat_Utils.pm
-rw-rw---- 1 pi dialout  23K Mär 14 18:41 99_Homematic_Utils.pm
-rw-rw---- 1 pi dialout  16K Mär 11 20:29 99_Homestatus_Utils.pm
-rw-rw---- 1 pi dialout 5,7K Mär 11 19:53 99_Messages_Utils.pm
-rw-rw---- 1 pi dialout 8,5K Mär 13 11:05 99_Network_Utils.pm
-rw-rw---- 1 pi dialout  14K Mär 13 10:49 99_SetDevices_Utils.pm


Zitat von: CoolTux am 16 März 2018, 18:23:34
In welcher myUtils welche Sub ist ist eigentlich fast ersichtlich, dennoch schreibe ich das in das notify oder in den watchdog als comment wo sich die sub befindet.
Nichts desto trotz ist minimalistisches denken vielleicht doch Punkt nummer eins  :)
Dito. Comments gibts bei mir auch zuhauf, um nicht immer wieder neu nachvollziehen zu müssen.


Zitat von: CoolTux am 16 März 2018, 18:23:34
Ich bilde mir ein so was ähnliches zu haben.

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

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

#### Helligkeitswert vom Pflanzensensor mit abfragen
CommandGet(undef,"PflanzenSensor3 sensorData") if($hour > 04 and $hour < 23);
fhem("sleep 60; get PflanzenSensor2 sensorData") if($hour > 04 and $hour < 23);


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

    if( ((ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) < 75 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 and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                    CommandSet(undef,'lightScenenLicht_Media scene Twilight_7_WohnzimmerFlurWeihnacht');
                    CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
                } else {
                    CommandSet(undef,'lightScenenLicht_Media scene Twilight_7_WohnzimmerFlur');
                    CommandSet(undef,'room=Weihnacht:FILTER=state=off on') if( Value("dummyLichtWinter") eq "active" );
                }
           } else {
                if( $adv and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                    CommandSet(undef,'lightScenenLicht_Media scene Twilight_7_WohnzimmerWeihnacht');
                    CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
                } else {
                    CommandSet(undef,'lightScenenLicht_Media scene Twilight_7_Wohnzimmer');
                    CommandSet(undef,'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" ) < 85 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 24 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) > 6
     and ReadingsVal( "twilightStahnsdorf", "state", "100" ) < 10 and $lux < 250 ) {
       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" ) < 85 and ReadingsVal( "twilightStahnsdorf", "state", "100" ) == 6
     and ReadingsVal( "twilightStahnsdorf", "nextEvent", "ss_weather" ) eq "ss_weather" and $lux < 250 ) {
       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" ) < 55 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 );
        CommandSet(undef,'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" ) < 45 and $lux < 200 and (Value("dummyLgTV") eq "on" or
     ReadingsVal("Eltern","state","absent") eq "home") ) {
       if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" ) {
            if( $adv and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_10_WohnzimmerFlurWeihnacht');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
            } else {
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_10_WohnzimmerFlur');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on') if( Value("dummyLichtWinter") eq "active" );
            }
       } else {
            if( $adv and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_10_WohnzimmerWeihnacht');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
            } else {
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_10_Wohnzimmer');
                CommandSet(undef,'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 and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_8_WohnzimmerFlurWeihnacht');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
            } else {
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_8_WohnzimmerFlur');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on') if( Value("dummyLichtWinter") eq "active" );
            }
       } else {
            if( $adv and Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) {     ## Abfrage Adventszeit aus 99_myUtils_Helper
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_8_WohnzimmerWeihnacht');
                CommandSet(undef,'room=Weihnacht:FILTER=state=off on');
            } else {
                CommandSet(undef,'lightScenenLicht_Media scene Twilight_8_Wohnzimmer');
                CommandSet(undef,'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" ) {
       CommandSet(undef,'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');
        CommandSet(undef,'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 < 400 ) {
       fhem('set (structureLichtWohnzimmer|NetzschalterKinZimIsabelHintenLinks):FILTER=STATE=on off; set group=Licht.Weihnachten:FILTER=state=on off');
        CommandSet(undef,'group=Licht.Weihnachtsbaum:FILTER=state=on off') if( Value("dummyWeihnachtsbaumAutoOFF") eq "active" ) ;
       
        CommandSet(undef,'LED_StreifenFlurDecke:FILTER=onoff=1 off') if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" and $lux > 300);
        CommandSet(undef,'LichtDimmerStevenDeckenLampe_Sw:FILTER=pct!=0 off') if( Value("rr_Steven") eq "home" and $lux > 250 and Value('autoLichtsteuerungSteven') eq 'on' );
    }

    elsif( ReadingsVal( "twilightStahnsdorf", "state", "100" ) == 6 and ReadingsVal( "twilightStahnsdorf", "twilight_weather", "100" ) > 75 or ($lux > 300 and $lux < 700) ) {
        fhem('set (structureLichtWohnzimmer|structureLichtBadezimmer|NetzschalterKinZimIsabelHintenLinks):FILTER=STATE=on off; set group=Licht.Weihnachten:FILTER=state=on off');
        CommandSet(undef,'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 < 700 ) {
            CommandSet(undef,'LED_StreifenFlurDecke:FILTER=onoff=1 off') if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" );
        }
       
        elsif ( ReadingsVal( "twilightStahnsdorf", "elevation", "15" ) > 15 and $lux > 400 and $lux < 800 ) {
            CommandSet(undef,'LED_StreifenFlurDecke:FILTER=onoff=1 off') if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" );
        }
       
        CommandSet(undef,'LED_StreifenFlurDecke:FILTER=onoff=1 off') if( Value( "LED_StreifenSelectTwilightDummy" ) eq "on" and $lux > 500);
        CommandSet(undef,'LichtDimmerStevenDeckenLampe_Sw:FILTER=pct!=0 off') if( Value("rr_Steven") eq "home" and $lux > 250 and Value('autoLichtsteuerungSteven') eq 'on' );
    }
}


Die Sub wird folgendermaßen ausgeführt

Internals:
   CFGFN     
   DEF        twilightStahnsdorf:azimuth:.*   {
                                    if( Value( "AnniKraussStr" ) eq "home" and Value( "autoBeleuchtungDummy" ) eq "on" ) {
                                        autoLightControl();
                                    }
                                }
   NAME       notifyLightControl
   NOTIFYDEV  twilightStahnsdorf
   NR         178
   NTFY_ORDER 50-notifyLightControl
   REGEXP     twilightStahnsdorf:azimuth:.*
   STATE      2018-03-16 18:17:45
   TYPE       notify
   READINGS:
     2018-03-11 17:49:50   state           active
Attributes:


Vielleicht hilft es als kleines Beispiel.
Wie Du siehst lohnt es sich nur zu prüfen ob Licht angemacht werden soll, wenn sich auch die äußeren Lichtverhältnisse ändern. Dafür muss ich aber nicht immer irgendwas prüfen. In meinem Fall trigger ich den verlauf der Sonne und erst dann wird geprüft. Das sind hier ms die dafür benötigt werden.

Ist in der Tat ähnlich. Ich habe auch eine Funktion auto_lights, die ursprünglich auch durch den Azimuth Wechsel getriggert wurde, war mir dann aber zu häufig. Timer fand ich da genauso ok. Bin dann immer noch beim Event :)
Mal meine zum Spaß:
sub auto_lights {
   
    Log 4, "#############################";
    Log 4, "auto_lights aufgerufen";
    play_tts_debug("Funktion auto lights aufgerufen");

    my $guest_dummy= "dGastModus";

     # weitere Lichter weiter unten aufgerufen.
    # Auf Namensveränderung achten !!
   

    # Tagmodus -> Abbruch
    if(Value("dNight_Time") eq "0") {
        fhem("set st_Alle_Lichter off;");      # Alle Lichter ausschalten
        Log 4, "Tagmodus. Breche ab.";
        play_tts_debug("Tagesmodus - Abbruch");
        return 0;
    }
   

    # HOME STATUS SLEEP, und wurde gerade zu SLEEP geschaltet ..
    if(Value("STATUS_HOME") eq "SLEEP" && OldValue("STATUS_HOME") ne "SLEEP" ) {
        # noch nichts
    }
   
   
    # HOME STATUS nicht HOME -> Abbruch
    if(Value("STATUS_HOME") ne "HOME") {
        Log 4, "HOME STATUS sollte HOME sein, ist: ". Value("STATUS_HOME") . "Breche ab.";
        return 0;
    }


    # Dummy für Auto-Modus anlegen, falls nicht vorhanden
    my $dummy_name = "dAuto_Light";
    if (!defined($defs{$dummy_name})) {
        my $default_state = "on";
        my $room = "Knöpfe";
        my $group = "Home Status";
        fhem("define $dummy_name dummy;attr $dummy_name room $room;set $dummy_name group $group;setstate $dummy_name $default_state;");
        Log 4, "Dummy: $dummy_name angelegt.Default: $default_state";
    }
    if(Value("dAuto_Light") ne "on" && Value("dAuto_Light") ne "off") { fhem("setstate dAuto_Light on");    } # On falls nicht gesetzt
    if(Value($dummy_name) eq "off" ) { Log 1, "auto_lights: Abgeschaltet."; return 0; }
   
    # Full-Auto-Light Dummy AN
    else {
   
        ###################
        # Lichter Auto AN
       
        Log 4, "Auto-Light an. Checke Lichter ..";
        #play_debug_sound("auto_lights_aufgerufen");
       
        #################################
        # Wohnzimmer
        my $schreibtisch = Value("Schreibtisch");
        my $game_pc = Value("WZ_Game_PC");
        my $musik = ReadingsVal("Musik","onoff","");
        my $tv = Value("TV");

        # WZ_Licht_Tisch_Hell
        # WZ_Licht_PC
        # WZ_Licht_bei_Terrarium     
        # WZ_Licht_Stromleiste_Sofa

        ###############################################################################
        # Helles Sofa-Licht unangetastet lassen, soll nur manuell ausgeschaltet werden.
       
       
        # Schreibtisch an / SpielePC aus / Musik aus
        if($schreibtisch eq "on" && $game_pc eq "off" && $musik eq "off") {
                Log 4, "Schreibtisch Mouds";play_tts_debug("Schreibtisch Modus");
                fhem("set stWZ_Schreibtisch_Licht on");
        }

        # Spiele PC an / Schreibtisch an / Musik aus
        elsif($schreibtisch eq "on" && $game_pc eq "on" && $musik eq "off") {
            Log 4, "Spiel PC Modus";
            play_tts_debug("Spiel PC Modus");
            fhem("    set stWZ_Licht_Warm on;
                    set stWZ_Licht_Hell off;
            ");
        }
       
        # Musik an | Schreibtisch aus
        elsif($musik eq "on" && $schreibtisch eq "off") {
                Log 4, "Musik / TV Licht an (Musik / TV Modus)";
                play_tts_debug("Musik TV Modus");
               
                # Terrarium und Sofa-Warm an
                fhem("set stWZ_Media_Licht on;");
        }

        # Musik an  | Schreibtisch an
        elsif($musik eq "on" && $schreibtisch eq "on") {
                Log 4, "Musik / TV | Schreibtisch Modus.";
                play_tts_debug("Mache alle warmen Lichter an");
               
                # Terrarium und Sofa-Warm an und PC-Licht an
                fhem("set stWZ_Licht_Warm on");
        }

        # TV an  | Schreibtisch aus
        if($tv eq "on" && $schreibtisch eq "off") {
                Log 4, "TV Mouds";
                play_tts_debug("TV Modus");
               
                # Terrarium und Sofa-Warm an und PC-Licht an
                fhem("    set stWZ_Media_Licht on;
                        set WZ_Licht_Tisch_Hell off;"
                );
        }

        ##################################
        # Schlafzimmer
        my $sz_box = Value("SZ_FB_3_Media");

        # Schlafzimmer Box
        if ($sz_box eq "on" ) {
            Log 4, "Schlafzimmer Box ist an. Mache kleines Licht an";
            fhem("set stSZ_Licht_WARM on; sleep 1; set stSZ_Licht_WARM on;");
        }
       
        #################################
        # Küche
        fhem("set IT1_KUE_Licht on");
       
        # Ende Lichter Auto An
        #########################
    }

    Log 4, "";
}


In auto_lights wird ein Dummy "dNight_Time" abgefragt. Dieser Dummy wiederum wird von einer anderen Funktion abenfalls per Timer gesetzt.
Also so ganz am Prinzip scheine ich doch nicht vorbei geschrieben zu haben (Gott sei Dank).

Meine periodischen Durchläufe habe ich irgendwann benötigt (anfangs ganz simpel gestrickt), weil die 433MHz geschalteten Lampen / Geräte oftmals nicht reagiert haben. Aus diesem Grund wurde es an vielen Stellen unsauber im Code, weil ich dann Signale mehrfach geschickt habe usw., irgendwie versucht habe das abzufangen. Letztlich dachte ich: Hey, ne periodische Funktion wär jetzt saugut.
So werden alle 433 MHz Devices periodisch immer wieder auf ihren gewünschten Zustand gesetzt, wenn doch mal ne Lampe das Ausschaltsignal nicht mitbekommen hat oder so. (Was nicht selten der Fall war)
Dann ist immer mehr in diese Funktion(en) geflossen.

Inzwischen habe ich die nur sporadisch funktionierenden IT's rausgenommen, und gegen Ediplugs, Sonoffs usw. ersetzt. (Die Sonoffs kann ich echt empfehlen).
Sprich, ich brauche die periodischen Nachschaltungen nicht mehr.
Viel Gerede ... ich schaue, wie ich das umsetzten kann. .... mann, das ist echt ne neverending Story :D



Edit: oh, vielen Dank für eure Meinungen und Hinweise ersteinmal. Ich schließe den Thread noch nicht, denn ich denke das sich vlt doch noch einige Fragen ergeben.
Ich mache mich jetzt ersteinmal daran, soweit wie möglich nur noch auf Events zu reagieren. Ich hoffe dadurch bleiben die auszuführenden Prozesse so klein, aufgesplittet und asynchron, daß das Problem des geblockten FHEM dann obsolet ist.

ftsinuglarity

#12
Das scheint gar kein so großes Unterfangen zu werden wie ich befürchtet habe. Ist eigentlich mehr ein Aufsplitten der Funktion und das Zuweisen an die richtigen Auslöser.

Was mir dabei aber gleich auffällt: Das funktioniert so viel sauberer in den Abläufen (bis jetzt). Viel umständliche Abfragerei fällt jetzt weg.
Das kommt dadurch, das ich jetzt auf ganz konkrete Ereignisse reagieren kann. Die allgemeinen Funktionsroutinen (wie periodical_Home_settings) konnte das nicht und musste erstmal alles abchecken, bevor sie irgendwas gemacht hat. Sehr umständlich, Zeit und Nervenraubend quasi alle möglichen Zustände von zig Devices abzufragen, im Fehlerfall abzufangen, in die richtige Konstellation zueinander zu bringen um dann schlußendlich zu schalten. Entsprechend fehleranfällig war das auch. Uff. Da bekomme ich vom Schreiben schon Kopfschmerzen.