InternalTimer und das liebe wieder finden / RemoveInternalTimer

Begonnen von CoolTux, 30 August 2018, 10:52:29

Vorheriges Thema - Nächstes Thema

CoolTux

Ich möchte einen InternalTimer starten, welchem ich mehr Informationen mitgeben muß wie nur den Hash der Instanz.

Hier mein erster Ansatz

## kleine Hilfe für InternalTimer damit ich alle benötigten Variablen an die Funktion übergeben kann welche von Internal Timer aufgerufen wird.
    my %funcHash = ( hash => $hash, shuttersdevice => $shuttersDev);

    #RemoveInternalTimer(\%funcHash,'AutoShuttersControl::SunSetShuttersAfterTimerFn');
    #RemoveInternalTimer(\%funcHash,'AutoShuttersControl::SunRiseShuttersAfterTimerFn');
    RemoveInternalTimer(\%funcHash);
   
    InternalTimer(computeAlignTime('24:00',$autoShuttersControlTimeSunset), 'AutoShuttersControl::SunSetShuttersAfterTimerFn',\%funcHash ) if( AttrVal($name,'autoShuttersControlEvening','off') eq 'on' );
    InternalTimer(computeAlignTime('24:00',$autoShuttersControlTimeSunrise), 'AutoShuttersControl::SunRiseShuttersAfterTimerFn',\%funcHash ) if( AttrVal($name,'autoShutterControlMorning','off') eq 'on' );

Ich gebe also einen Hash mit der mir Informationen bereit stellt.
Wie man sieht erstelle ich den Hash, will dann einen laufenden InternenTimer mit diesem Hash löschen und einen neuen InternalTimer erstellen.
In der Nacht kam mir dann die "Erleuchtung" das dies Unsinn ist, da sich der Hash ja bei jedem mal neu erstellen ändert. Das löschen also deswegen nicht klappen kann.
Danach habe ich mich mal durch diverse Module gekämpft und festgestellt das das ein oder andere Modul es genau so macht.
Exemplarisch das 10_EnOcean Modul.


my %functionHash = (hash            => $hash,
                      function        => "demandResponseExec",
                      drLevel         => $drLevel,
                      powerUsage      => $powerUsage,
                      powerUsageLevel => $powerUsageLevel,
                      powerUsageScale => $powerUsageScale,
                      setpoint        => $setpoint
                     );
  ...
  RemoveInternalTimer(\%functionHash);

.......
.......
......

    InternalTimer(gettimeofday() + $randomTime, "EnOcean_demandResponseExec", \%functionHash, 0);
.........
..........
    InternalTimer(gettimeofday() + $randomTime, "EnOcean_demandResponseExec", \%functionHash, 0);


Hier wird auch ein Hash erstellt und dann mit diesem versucht einen laufenden InternalTimer zu finden. Aber das kann so nicht gehen. Der Hash ändert sich bei jedem neu erstellen und somit kann kein korrekter InternalTimer gefunden werden.


Ist der Code also Sinnlos im EnOcean Modul oder übersehe ich etwas?




Grüße
Leon
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

rudolfkoenig

Ich meine auch, dass das so nicht funktionieren kann.
Die Loesung ist einfach:RemoveInternalTimer($hash->{myTimer}) if($hash->{myTimer});
$hash->{myTimer} = { hash=>$hash, ...};
InternalTimer($timeToStart, sub(){...}, $hash->{myTimer}, 0);

CoolTux

Danke Rudi,

Ich wollte nur wissen ob ich mal wieder zu Quer denke.
Dein Beispiel legt aber nur eine Timer Information ab, ich brauche im schlimmsten Fall bis zu 40 oder 50 Timer Informationen.
Aktuell lege ich den Hash in ein Reading direkt in das Device welches den Timer betrifft.


Grüße
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

rudolfkoenig

Zitatich brauche im schlimmsten Fall bis zu 40 oder 50 Timer Informationen.
- man kann auch 50 Eintraege ins devicehash packen ($hash->{myTimerSunset}, ...).
- man kann auch nur einen Timer haben (mit dem naechsten Zeitpunkt), und in der aufgerufenen Funktion entscheiden, was gerade zu tun ist.

Ich habe zu wenig Informationen, und will eigentlich nicht raten.


CoolTux

Zitat von: rudolfkoenig am 30 August 2018, 11:44:00
- man kann auch 50 Eintraege ins devicehash packen ($hash->{myTimerSunset}, ...).
- man kann auch nur einen Timer haben (mit dem naechsten Zeitpunkt), und in der aufgerufenen Funktion entscheiden, was gerade zu tun ist.

Ich habe zu wenig Informationen, und will eigentlich nicht raten.

Passt schon. Vielen Dank fürs mitdenken.
Habe eine Lösung gefunden mit der ich Leben und die ich Verantworten kann.



Grüße
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