readingsSingleUpdate() ohne Event im notify

Begonnen von TeeVau, 29 August 2013, 08:30:14

Vorheriges Thema - Nächstes Thema

TeeVau

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
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

rudolfkoenig

>  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.

TeeVau

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
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen