FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: mircoby am 02 Februar 2014, 23:13:49

Titel: InternalTimer setzen, Code ausführen anschließend wieder löschen
Beitrag von: mircoby am 02 Februar 2014, 23:13:49
Hallo zusammen!

Folgende Aufgabenstellung möchte ich gerne umsetzen:

Auf einer Synology Diskstation läuft eine Videostation um TV Aufnahmen zu relalisieren. Die Diskstation fährt selbständig herunter sobald sie nicht mehr gebraucht wird. Wenn nun eine Timeraufnahme in der Zukunft programmiert ist, soll die Diskstation über wake on lan vom FHEM geweckt werden. FHEM läuft auf einem separaten Server.

Was schon funktioniert:
- extrahieren des Aufnahemtimers in der Synology, übertragen des Timerwertes per Telnet an FHEM (FHEM_SetAbsTimer($))
- setzen des InternalTimer() in FHEM
- Aufwecken der der Diskstation per WOL.

Also im Prinzip fast schon alles. Was jetzt noch fehlt ist das Löschen der abgelaufenen Timer. (wenn die Timer nicht gelöscht werden, wird fhem mit zunehmender Anzahl von Timern spürbar langsamer).

so sieht die 99_myUtils.pm aus:

sub FHEM_SetAbsTimer($)
{
my ($timervalue, $hash) = @_;

Log 1, "received Timervalue: " . strftime('%d.%m.%Y %H:%M:%S',localtime($timervalue));

InternalTimer($timervalue, "Timeraction", $hash, 0);
}

sub Timeraction()
{
  # NAS Aufwecken
  fhem "set SynologyDS on";
}

Folgende Punkte (perl basics) sind mir unklar:

1) Die Funktion FHEM_SetAbsTimer($) wird mit nur einem Parameter, der absoluten Zeit ($wakeuptime im Unix format) aus einem Script auf der Synology Diskstation per telnet aufgerufen:
      # Auszug aus bash script
      {
      echo
      echo "{FHEM_SetAbsTimer($wakeuptime)}"
      echo exit
      } | telnet ipFhemServer:7072

In der Funktion wird der Übergabeparameter dann in die interne Variable my $timervalue übernommen, soweit alles ok. Nun die Frage: Wo kommt der $hash her? Er wird mit my ($timervalue, $hash) =@_ initialisiert. Eigentlich müssten doch beim Aufruf der Funktion  FHEM_SetAbsTimer($) 2 Variablen übergeben werden, der $timervalue und der $hash!? Nachdem nur der $timervalue übergeben wird und der Timer trotzdem gesetzt und ausgeführt wird, muss der $hash anderweitig bekannt sein. Woher?

2.) Der Nächste Schritt wäre dann in der Funktion Timeraction() den gerade ausgefürten Timer wieder mit RemoveInternalTimer($hash) zu löschen. Auch hier wieder die Frage, wo den $hash hernehmen? (der $hash aus der Funktion FHEM_SetAbsTimer() ist ja nur innerhalb der sub gültig, da mit my() als intern deklariert.)

Über eine Beschreibung wie man mit den hashtags, funktionsübergreifend umgeht würde ich mich freuen.

Vielen Dank
Gruß mircoby