FHEM Forum

FHEM => Automatisierung => Thema gestartet von: throbin am 19 März 2017, 12:21:14

Titel: Temporäre Timer (at) - FHEM meldet strukturelle Änderungen an der cfg
Beitrag von: throbin am 19 März 2017, 12:21:14
Hi,

ich möchte verzögert auf ein Notify reagieren (Strommessung + Abschaltung des WallPlugs nach einer bestimmten Zeit). Im Notify verwende ich folgenden Perl-Aufruf:

WP1:(on|off) {
  EventHandlerWP1Impl($EVENT);
}


Die Perl-Funktion sieht so aus (die Methode "DeleteTimerIfDefined" prüft ob der Timer existiert und löscht diesen ggf., analog zu defmod):

sub EventHandlerWP1Impl($)
{
  my ($ev) = @_;
 
  DeleteTimerIfDefined('tmp_timer_WP1AutoOff');
 
  if($ev eq 'on' or $ev eq 'an')
  {
    my $ct = ReadingsVal("dAutoOffWP1", "cycleTime", "00:10:00");
    fhem("define tmp_timer_WP1AutoOff at +*$ct { CheckWallplugPowerCyclic();;}");
  }
}


Die Funktion aus dem Timer-Callback:

sub CheckWallplugPowerCyclic()
{
    my $pwr = ReadingsNum("WP1", "power", -1);
    if($pwr >= 0 && $pwr <= $mp)
    {
      fhem("set WP1 off");
    }
  } 
}


Mein Problem ist, dass FHEM nach jedem Notify strukturelle Veränderungen an der Konfiguration meldet, als ob ich die cfg verändert habe und speichern muss.
Kann man das irgendwie umgehen, bzw. darf ich nur bestimmte Timer temporär verwenden?

Danke im Voraus!
Titel: Antw:Temporäre Timer (at) - FHEM meldet strukturelle Änderungen an der cfg
Beitrag von: betateilchen am 19 März 2017, 12:24:13
Ein wiederholender Timer ist kein temporärer Timer. Deshalb wird der als strukturelle Veränderung klassifiziert und so, wie es vorgesehen ist, mit einem roten Fragezeichen signalisiert.
Titel: Antw:Temporäre Timer (at) - FHEM meldet strukturelle Änderungen an der cfg
Beitrag von: Benni am 19 März 2017, 14:11:27
Du kannst das ganze aber auch so umbauen, dass du mit sleep, statt timern arbeitest, dann kommst du um die strukturelle Änderung rum.

Im Notify einfach mit sleep 10 Minuten Verzögerung einbauen, bis deine CheckWallplugPowerCyclic sub aufgerufen wird:

fhem("sleep 600;;{CheckWallplugPowerCyclic()}");

und das selbe dann nochmal in einem else-Zweig, wenn nicht "off" geschaltet wird, damit nach 10 Minuten wieder geprüft wird.

Ein sleep kann auch eine id haben und kann bei Bedarf dann mit dieser und dem Befehl cancel abgebrochen werden (in deinem Fall dann, wenn dein notify ein "off" gemeldet bekommt.
zu sleep und cancel ggf. die enlischsprachige Commandref konsultieren, in der deutschen ist die Beschreibung dazu glaube ich nicht ganz vollständig.

Titel: Antw:Temporäre Timer (at) - FHEM meldet strukturelle Änderungen an der cfg
Beitrag von: throbin am 19 März 2017, 19:50:10
Hi,

danke für die schnelle Antworten! Ich werde es mit dem sleep machen.

Gruß
throbin