FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: TeeVau am 29 August 2013, 08:30:14

Titel: readingsSingleUpdate() ohne Event im notify
Beitrag von: TeeVau am 29 August 2013, 08:30:14
Hallo,

ich wundere mich gerade darüber, dass readingsSingleUpdate() augenscheinlich unterschiedlich funktioniert oder ich etwas falsch mache ohne es zu wissen.
Ich möchte eigentlich nur den Inhalt eines Readings per FileLog loggen. Durch Tests habe ich festgestellt, dass das eigentlich mit readingsSingleUpdate() funktioniert, allerdings funktioniert es in meinem Notify nicht.
Mit dem folgendem Code ermittel ich die Betriebssekunden einer Pumpe:

bk_pumpe:(off|on-for-timer).* {
  my @EVTPART = split(" ", $EVENT);
  if($EVTPART[0] eq "on-for-timer"){
    readingsSingleUpdate($defs{$NAME},"onTime", time(), 0);
  }elsif($EVTPART[0] eq "off"){
    my $runtime = ReadingsVal($NAME, 'betriebssekunden', '0');
    my $onTime = ReadingsVal($NAME, 'onTime', '0');
    if($onTime != 0){
      CommandDeleteReading(undef, "$NAME onTime");
      $runtime += (time() - $onTime);
      readingsSingleUpdate($defs{$NAME},"betriebssekunden", $runtime, 1);
      Log 3, "Watering Betriebssekunden: $runtime";

      my $tmp = "";
      foreach my $dev (devspec2array("group=Bewässerungsdüsen")) {
        last if($dev eq "bk_drip_Total");
        $tmp += (ReadingsVal($dev, "totalAmmount", "0") * 1000 / 60 / 60) * $runtime;
        Log 3, "Debug: $dev -- $tmp";
      }
      readingsSingleUpdate($defs{bk_drip_Total},"actualDay", ceil($tmp), 1);
      fhem("attr bk_pumpe alias Pumpe ($runtime s)");
    }
  }
}

In diesem notify wird durch den folgenden Befehl kein Event ausgelöst und somit auch nichts per FileLog getriggert.
readingsSingleUpdate($defs{$NAME},"betriebssekunden", $runtime, 1);

Gleichzeitig gibt es aber noch ein at, was jeden Tag um 23:59 den Zähler auf 0 setzt:

*23:59 {
readingsSingleUpdate($defs{bk_drip_Total},"actualDay", "0", 1);
readingsSingleUpdate($defs{bk_pumpe},"betriebssekunden", "0", 1);
fhem("deleteattr at_watering2 disable");
}

Hier führt readingsSingleUpdate() augenscheinlich ein Event aus, denn der Wert 0 vom Reading betriebssekunden wird im FileLog erfasst:

2013-08-28_23:59:01 bk_pumpe betriebssekunden: 0
2013-08-28_18:38:26 bk_pumpe off
2013-08-28_18:37:26 bk_pumpe on-for-timer 60
2013-08-28_16:01:00 bk_pumpe off
2013-08-28_16:00:00 bk_pumpe on-for-timer 60
2013-08-28_11:21:42 bk_pumpe off
2013-08-28_11:21:41 bk_pumpe off
2013-08-28_11:21:39 bk_pumpe on
2013-08-28_09:22:53 bk_pumpe betriebssekunden: 192
2013-08-28_08:03:12 bk_pumpe off
2013-08-28_08:00:00 bk_pumpe on-for-timer 192
2013-08-27_23:59:00 bk_pumpe betriebssekunden: 0

Das Event um 09:22:53 habe ich selber ausgelöst, da ich testen wollte ob readingsSingleUpdate() ein Event auslöst oder nicht.
bei bk_pumpe handelt es sich um eine FS20 Schaltsteckdose.

Habe ich irgendwo einen Denkfehler, dass sich das ganze so Verhält wie es ist?

Grüße, Tobias
Titel: Aw: readingsSingleUpdate() ohne Event im notify
Beitrag von: rudolfkoenig am 29 August 2013, 09:31:33
>  Habe ich irgendwo einen Denkfehler

Denkfehler ist uebertrieben.

Das Problem hier ist, das readingsSingleUpdate aufgerufen in einem notify keine Events ausloest.
Genauer gesagt dann, falls das notify durch den ParseFn aufgerufen wurde, was aber der Normalfall ist.

Evtl. koennte Dir ein explizites DoTrigger helfen.
Titel: Aw: readingsSingleUpdate() ohne Event im notify
Beitrag von: TeeVau am 29 August 2013, 12:35:50
Danke, dann lag es ja wenigstens nicht an einem groben Schnitzer von mir.
DoTrigger bzw. fhem("trigger ...") hat ebenfalls nicht funktioniert. Habe es jetzt mit einem temporären at gelöst:

bk_pumpe:(off|on-for-timer).* {
  my @EVTPART = split(" ", $EVENT);
  if($EVTPART[0] eq "on-for-timer"){
    readingsSingleUpdate($defs{$NAME},"onTime", time(), 0);
  }elsif($EVTPART[0] eq "off"){
    my $runtime = ReadingsVal($NAME, 'betriebssekunden', '0');
    my $onTime = ReadingsVal($NAME, 'onTime', '0');
    if($onTime != 0){
      CommandDeleteReading(undef, "$NAME onTime");
      $runtime += (time() - $onTime);
      readingsSingleUpdate($defs{$NAME},"betriebssekunden", $runtime, 1);
      fhem("define at_tmp1 at +00:00:02 trigger $NAME betriebssekunden $runtime");
      Log 3, "Watering Betriebssekunden: $runtime";

      my $tmp = "";
      foreach my $dev (devspec2array("group=Bewässerungsdüsen")) {
        last if($dev eq "bk_drip_Total");
        $tmp += (ReadingsVal($dev, "totalAmmount", "0") * 1000 / 60 / 60) * $runtime;
        Log 3, "Debug: $dev -- $tmp";
      }
      readingsSingleUpdate($defs{bk_drip_Total},"actualDay", ceil($tmp), 1);
      fhem("attr bk_pumpe alias Pumpe ($runtime s)");
    }
  }
}


Das erzeugt wie gewünscht den Eintrag im FileLog:

2013-08-29_12:32:30 bk_pumpe betriebssekunden 127
2013-08-29_12:32:28 bk_pumpe off
2013-08-29_12:30:28 bk_pumpe on-for-timer 120
2013-08-29_12:30:05 bk_pumpe betriebssekunden 7