Watchdog löst zu oft aus

Begonnen von elfrinjo, 05 September 2016, 18:00:59

Vorheriges Thema - Nächstes Thema

elfrinjo

Hallo zusammen,

ich hänge gerade an einem Wäsche-Fertig Watchdog, der sich zu oft meldet.
Meiner Meinung nach solte der WD nur am Ende des Waschgangs +10 Minuten getriggert werden, er löst aber auch zwischendrin aus. Offensichtlich stimmt etwas an meiner Logik nicht... es wäre nett wenn sich das mal jemand anschauen könnte :)



Ich messe der Stromverbrauch der Waschmaschine mit einer Fritz DECT200.


define pm_ug_waesche FBDECT fb_aha:08761_9999999 powerMeter,tempSensor,switch
attr pm_ug_waesche IODev fb_aha
attr pm_ug_waesche event-on-change-reading power
attr pm_ug_waesche model Dect200
attr pm_ug_waesche room FritzBox


der DECT200 hat ein Reading
power 55.07 W
das ich hier in eine saubere Zahl umwandle


define ny_waescheWatt notify pm_ug_waesche:power:.* {\
  my $power = ReadingsVal("pm_ug_waesche","power","");;\
  $power =~ s/\D+//g;;\
  $power /= 100;;\
  fhem ("set pm_ug_waescheWatt $power")\
}
attr ny_waescheWatt room FritzBox


Über zwei Notifys wid jetzt ein Dummy "Hoher Verbrauch" ein und ausgeschaltet


define ny_waescheHoherVerbrauchOn notify pm_ug_waescheWatt:.* {\
  Log(1, "XXX Hoher Verb ON");;\
  fhem ("set pm_ug_waescheHoherVerbrauch on") if (Value("pm_ug_waescheWatt") > 20)\
}
attr ny_waescheHoherVerbrauchOn room FritzBox

define ny_waescheHoherVerbrauchOff notify pm_ug_waescheWatt:.* {\
  Log(1, "XXX Hoher Verb OFF");;\
  fhem ("set pm_ug_waescheHoherVerbrauch off") if (Value("pm_ug_waescheWatt") <= 20)\
}
attr ny_waescheHoherVerbrauchOff room FritzBox

define pm_ug_waescheHoherVerbrauch dummy
attr pm_ug_waescheHoherVerbrauch event-on-change-reading state
attr pm_ug_waescheHoherVerbrauch room FritzBox


Auf diesen Dummy schaut ein Watchdog, der sich melden soll, falls länger als zehn Minuten der hohe Verbauch OFF ist


define wd_waescheFertig watchdog pm_ug_waescheHoherVerbrauch:off 00:10:00 pm_ug_waescheHoherVerbrauch:on\
set fb_box ring 610 18 say:Eine Nachricht aus dem Keller. Die Wäsche ist fertig! ;;\
set xmp_example.com msg user@example.com Die Waesche ist fertig. ;;\
setstate wd_waescheFertig defined
attr wd_waescheFertig regexp1WontReactivate 1
attr wd_waescheFertig room FritzBox


Aber wie ihr seht, scheint der Watchdog nicht nicht durch "Hoher Verbrauch ON gestoppt zu werden; sondern läuft 10 Minuten nach dem ersten auslösen los...


2016.08.19 16:53:56 1: XXX Hoher Verb OFF
2016.08.19 16:53:56 1: XXX Hoher Verb ON
2016.08.19 16:56:56 1: XXX Hoher Verb OFF
2016.08.19 16:56:56 1: XXX Hoher Verb ON
2016.08.19 16:59:56 1: XXX Hoher Verb OFF
2016.08.19 16:59:56 1: XXX Hoher Verb ON
2016.08.19 17:02:56 1: XXX Hoher Verb OFF
2016.08.19 17:02:56 1: XXX Hoher Verb ON
2016.08.19 17:03:56 3: Watchdog wd_waescheFertig triggered
2016.08.19 17:03:56 3: FRITZBOX: set fb_box ring 610 18 say:Eine Nachricht aus dem Keller. Die Wäsche ist fertig!
2016.08.19 17:05:56 1: XXX Hoher Verb OFF
2016.08.19 17:05:56 1: XXX Hoher Verb ON
2016.08.19 17:08:56 1: XXX Hoher Verb OFF
2016.08.19 17:08:56 1: XXX Hoher Verb ON
2016.08.19 17:11:56 1: XXX Hoher Verb OFF
2016.08.19 17:11:56 1: XXX Hoher Verb ON
2016.08.19 17:14:58 1: XXX Hoher Verb OFF
2016.08.19 17:14:58 1: XXX Hoher Verb ON
2016.08.19 17:15:56 3: Watchdog wd_waescheFertig triggered




Wo liegt mein Gedankenfehler?


Herzliche Grüße aus Münster, Jörg




EDIT: Typo, Notify in Code 3 ergänzt

RadioJames

Hallo elfrinjo,

ohne jetzt deine Implementierung näher angeschaut zu haben: Warum glaubst du, dies sei ein Logikproblem?
Ich würde die Powerevents, die gesendet werden, alle in ein File loggen und erst mal überprüfen, ob nicht tatsächlich während des Waschprogramms für das Zeitlimit, das du gesetzt hast, die Grenze unterschritten wird. Ich nehme an, du hast das Limit gewählt, um nicht auch noch das Knitterschutzprogramm abwarten zu müssen. Bei meinem Trockner ist es leicht. Nach Beenden sinkt die Leistung unter 1 Watt. Bei meiner Waschmaschine habe ich allerdings bei manchen Waschprogrammen ein ähnliches Problem. Und mein Limit liegt sogar bei 80W, da der Knitterschutz Peaks bis kurz darunter zeigt.

Also mein Tipp ist, erst mal die Powerwerte loggen und überprüfen.

Grüße
James
There are 10 kind of people. Those who understand binary and those who don't.

elfrinjo

Hi James,

danke für die Antwort. Aber wenn du mal unten in das Log schaust, tue ich das schon.

Es werden jede Menge Events für Stromverbrauch größer und kleiner 20 Watt ausgelöst.
Der Inhalt der WD wird allerdings 10 Minuten nach dem ersten "Stromverbrauch < 20W" ausgelöst - obwohl er inzwischen schon mehrmals zurückgesetzt hätte werden sollen.


Cheers, Jörg

RadioJames

Hallo Jörg,

aus dem Code in deinem 3. Fenster werde ich nicht schlau ("define ny_waescheHoherVerbrauchOn ..."). Du schreibst, es wird ein Dummy ein- und ausgeschaltet, der Off Zweig fehlt aber. Da "off" im Logging vorkommt, fehlt offensichtlich ein Stück Code. Auch loggst du immer "ON", setzt "pm_ug_pm_ug_waescheHoherVerbrauch" aber nur auf "ON", wenn der Verbrauch über 20 W liegt. D.h. ein ON im Log muss nicht gleichzeitig einen Verbrauch > 20 W bedeuten.

Ich denke du solltest zumindest in deinen Perl Abschnitten noch detaillere Logs einbauen und auch den konkreten Powerwert ausgeben.
Mit dem watchdog Modul habe ich noch nicht gearbeitet, gemäss der Beschreibung in der commandref sieht dein Code aber OK aus.

Grüße
James

P.S. Ich verstehe nicht, wie man sich diese Klimmzüge in der fhem.cfg antun kann. Ich halte meinen Code dort lieber minimal und lagere in Perl Module aus (99_MyxxxUtil)
        ;)

There are 10 kind of people. Those who understand binary and those who don't.

elfrinjo

Hallo James,

upps, da habe ich einen Notify im dritten Codeblock vergessen; den habe ich erstmal im OP ergänzt.

Bei der Gelegenheit ist mir aufgefallen, dass es wenig Sinn macht zwei sehr ähnliche Notifys als jeweils eigene Entitäten zu haben, so sind die beiden jetzt zusammengefasst.
Ich werde berichten, ob das etwas ändert.

Cheers, Jörg

elfrinjo

OK,

jetzt habe ich gerade ich der Referenz das folgende Beispiel für DOIF gefunden:

Zitat
Anwendungsbeispiel: Benachrichtung "Waschmaschine fertig", wenn Verbrauch mindestens 5 Minuten unter 2 Watt (Perl-Code wird in geschweifte Klammern gesetzt):

define di_washer DOIF ([power:watt]<2) ({system("wmail washer finished")})
attr di_washer wait 300

Eine erneute Benachrichtigung wird erst wieder ausgelöst, wenn zwischendurch der Verbrauch über 2 Watt angestiegen war.

Damit habe ich sämtliche Lust am Watchdog verloren ;-) Ich baue diese Variante ein und werde die gesamte Config noch einmal posten wenn es funktioniert.


Cheers, Jörg

RadioJames

Vielleicht interessiert dich mal meine Implementierung.

An HW verwende ich Homematic Zwischenstecker mit Leistungsmessung und eine MP3 Sprachausgabe (Bausatz, auch von Homematic)

-----------------------------------------------------------------------------------------------------------------------------------------------------------
Änderungen in der fhem.cfg:  (Relevante Events haben alle "SenPwr" im Namen, dies triggert Perl Funktion "UpdatePower")
-----------------------------------------------------------------------------------------------------------------------------------------------------------
define ntfy.PowerUpdate notify (.*SenPwr.*) {UpdatePower($NAME, $EVENT)}


---------------------------------------
Implementierung im Perl Modul:
---------------------------------------
(1) Datenstrukturen / Variablen
my $log_level_update_power = 1;
my @power_meter_devices = (
  {
    "name" => "harSteckdosePM_SenPwr", "power_limit" => 80, "time" => "00:05:00", "state" => "unknown",
    "device" =>"Waschmaschine", "ready_timer" => 0, "func" =>  "Waschmaschine_fertig"
  },
  {
    "name" => "harTrockner_SenPwr", "power_limit" => 20, "time" => "00:01:00", "state" => "unknown",
    "device" => "Trockner", "ready_timer" => 0, "func" =>  "Trockner_fertig"
  },
);

Für jeden Zwischenstecker wird eine Struktur innerhalb "power_meter_devices" angelegt
name:           Name des Homematic Gerätes
power_limit:  Limit in Watt, das für "time" permanent unterschritten werden muss, um eine Ende des Waschens/Trocknens zu erkennen
time:             in Erklärung "power_limit" enthalten
state:           "unknown" (init), "inaktiv" oder "laeuft"
device:          Realname für Loggings
ready_timer: 1, wenn Gerät läuft und Powerlimit wurde unterschritten, wird zurückgesetzt wenn innerhalb "time" höherer Powerwert erkannt wird
func:             Pointer auf Resultatfunktion, wenn Ende erkannt wurde

(2) Handlerfunktion (die auskommentierten Loggings waren zum Debuggen)
sub
UpdatePower($$)
{
  my ($NAME, $EVENT) = @_;
  my $power_value = $EVENT;
  my $href;

  foreach ( @power_meter_devices )
  {
    if ($_->{name} eq $NAME)
    {
      #Log($log_level_update_power, "  $_->{name} erkannt");
      $href = $_;
      last;
    }
  }

  if (! defined $href)     # Sensor nicht gefunden
  {
    #Log($log_level_update_power, "WARNING - UpdatePower - Sensor nicht bekannt (NAME:$NAME, EVENT:$EVENT)");
    return;
  }

  if ($power_value > $href->{power_limit}) # Geraet verbraucht mehr als Limitwert an Watt
  {
    if ($href->{state} ne "laeuft")
    {
      Log($log_level_update_power, "UpdatePower: $href->{device} - Start erkannt (P=$power_value)");
      $href->{state} = "laeuft";
      fhem("set $href->{device} $href->{state}");       # update dummy fuer Anzeige im Frontend
    }
    elsif ($href->{ready_timer})                        # setze Ende-Kennung zurueck
    {
      $href->{ready_timer} = 0;
      fhem("delete  at.tmp.$href->{device}_timer");
      #Log($log_level_update_power, "UpdatePower[$href->{device}]: Ende-Erkennungs-Timer geloescht (P=$power_value)");
    }
  }
  elsif (($href->{state} eq "laeuft") && (!$href->{ready_timer}))
  {
    # Geraet verbraucht weniger als oder gleich Limitwert in Watt und der
    # Ende-Erkennungstimer ist noch nicht gesetzt
    $href->{ready_timer} = 1;
    fhem("define at.tmp.$href->{device}_timer at +$href->{time} {$href->{func}()}");
    #Log($log_level_update_power, "UpdatePower[$href->{device}]: Ende-Erkennungs-Timer gestartet (power=$power_value)");
  }
  #Log($log_level_update_power, "UpdatePower: $power_value (name:$NAME event:$EVENT)");
}


(3) Result-Funktionen (können noch optimiert werden, z.b. zusammengefasst in einer parametrisierten Funktion)
sub
Waschmaschine_fertig()
{
  my $href = $power_meter_devices[0];

  $href->{state} = "inaktiv";
  $href->{ready_timer} = 0;
  fhem("set Waschmaschine $href->{state}"); # update dummy fuer Anzeige im Frontend
  fhem("set wzMp3Sprachausgabe playTone 3"); # ToDo: in Funktion auslagern, Logging einfuegen
  Log($log_level_update_power, "Waschmaschine_fertig: state: $href->{state}");
}


sub
Trockner_fertig()
{
  my $href = $power_meter_devices[1];

  $href->{state} = "inaktiv";
  $href->{ready_timer} = 0;
  fhem("set Trockner $href->{state}"); # update dummy fuer Anzeige im Frontend
  fhem("set wzMp3Sprachausgabe playTone 4"); # ToDo: in Funktion auslagern, Logging einfuegen
  Log($log_level_update_power, "Trockner_fertig: state: $href->{state}");
}
There are 10 kind of people. Those who understand binary and those who don't.

elfrinjo

#7
Meine Implementierung mit DECT200 Steckdose sieht jetzt so aus:


define fb_aha FBAHAHTTP fritz.box
attr fb_aha polltime 60

define pm_ug_waesche FBDECT fb_aha:01234_01234567 powerMeter,tempSensor,switch
attr pm_ug_waesche IODev fb_aha
attr pm_ug_waesche event-on-change-reading power:1
attr pm_ug_waesche model Dect200

define di_waescheFertig DOIF ([pm_ug_waesche:power]<20) (\
  set fb_box ring 610 10 say:Eine Nachricht aus dem Keller. Die Wäsche ist fertig! ;;\
  set xmp_elfring.ms msg me@you.com Die Waesche ist fertig. ;;\
)
attr di_waescheFertig wait 300


FHEM scheint sehr tolerant zu sein, was Einheiten den Readings angeht. Somit ist das aufräumen des Watt-Wertes nicht notwendig und was überbleibt ist so minimalistisch wie man es sich nur wünschen kann.


Cheers, Jörg

Damian

Zitat von: elfrinjo am 10 September 2016, 14:49:13
Meine Implementierung mit DECT200 Steckdose sieht jetzt so aus:


define fb_aha FBAHAHTTP fritz.box
attr fb_aha polltime 60

define pm_ug_waesche FBDECT fb_aha:01234_01234567 powerMeter,tempSensor,switch
attr pm_ug_waesche IODev fb_aha
attr pm_ug_waesche event-on-change-reading power:1
attr pm_ug_waesche model Dect200

define di_waescheFertig DOIF ([pm_ug_waesche:power]<20) (\
  set fb_box ring 610 10 say:Eine Nachricht aus dem Keller. Die Wäsche ist fertig! ;;\
  set xmp_elfring.ms msg me@you.com Die Waesche ist fertig. ;;\
)
attr di_waescheFertig wait 300


FHEM scheint sehr tolerant zu sein, was Einheiten den Readings angeht. Somit ist das aufräumen des Watt-Wertes nicht notwendig und was überbleibt ist so minimalistisch wie man es sich nur wünschen kann.


Cheers, Jörg

"sehr tolerant" würde ich nicht sagen. Wenn in im Reading power eine Einheit drin steckt, dann funktioniert der Vergleich mit < 20 nicht richtig und es gibt eine Warnung im Log.
Für solche Fälle kann DOIF nach Zahlen filtern hier mit der Angabe [pm_ug_waesche:power:d]<20

Bei DOIF solltest du die Befehle mit Komma trennen, dann brauchst du keine Semikolons doppeln.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF