Autor Thema: Temporäre Timer (at) - FHEM meldet strukturelle Änderungen an der cfg  (Gelesen 173 mal)

Offline throbin

  • Full Member
  • ***
  • Beiträge: 103
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!

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 12974
  • Probleme sind auch keine Lösung.
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.
Aus technischen Gründen befindet sich die Signatur auf der Rückseite dieses Beitrages.

Offline Benni

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1458
  • FHEMinist
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.

FHEM (FL 9.9) (configDB+DbLog) auf Debian Wheezy.
Jede Menge HM mit HMLAN und HMUART (WeMos+esp-link) über VCCU
UniRoll an CUL868. Sebury F2-2 RFID über ESPEasy
Module: 98_rssFeed und 98_QRCode

Offline throbin

  • Full Member
  • ***
  • Beiträge: 103
Hi,

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

Gruß
throbin