Autor Thema: [geklärt] $count-Variable bei set_Exec (DOIF-PerlModus)  (Gelesen 249 mal)

Offline Sany

  • Full Member
  • ***
  • Beiträge: 292
Hi Damian,

bin gerade an einem Countdowntimer innerhalb meiner Beschattungssteurung und bin auf folgendes gestoßen:

defmod di_Countdown DOIF countdn {\
\
if([+:01]){\
\
$_astroInterval = 300;;\
del_Exec("phaseCounter");;\
set_Reading("astroCountdown",$_astroInterval / 60,1);;\
set_Exec("phaseCounter",12,'set_Reading("astroCountdown",($_astroInterval / 60) - $count - 1,1)','$count <= ($_astroInterval / 60)');; \
}\
}
attr di_Countdown room Test
attr di_Countdown stateFormat astroCountdown

setstate di_Countdown 5
setstate di_Countdown 2021-06-06 13:49:00 astroCountdown 5

Das DOIF belegt jede Minute das Reading astroCountdown mit 5 vor, löscht den Timer und setzt ihn neu. Alle 12 Sek wird dann von astraCountdown 1 abgezogen, genauer es wird von den 5 die Variable $count abgezogen.
Im Beispiel funktioniert die Ausgabe wie gewünscht, d.h. astroCountdown zählt von 5 bis 1 und fängt dann von vorne an. Das klappt aber nur, weil ich zusätzlich 1 abziehe.Das "Problem" kommt vom gesetzten timer:
Wird der Timer um 13:40:00 neu gestartet erzeugt er ein Reading timer_phaseCounter 06.06.2021 13:41:012 0. Nach Ablauf der Zeit (hier 12 sek) wird dann die 0 abgezogen, dh.h. der Countdown verringert sich nicht. Um 13:41:12 entsteht der timer_phaseCounter 06.06.2021 13:41:024 1.
D.h. also, der Counter zählt nach der ersten Runde 0, nach der 2ten 1 usw. Müsste $count da nicht mit 1 vorbelegt sein?
(die Zeiten sehen etwas komisch aus, Ziel ist ein 5min Countdown, war mir beim testen nur zu lange zum warten, deshalb 5 x 12sek in 1 minute. Zur Demo taugt es)

Wie siehst Du das?

Grüß

Sany
« Letzte Änderung: 06 Juni 2021, 19:54:27 von Sany »
fhem auf Zotac ZBox nano als LVM unter Proxmox, Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, ZigBee/deConz, Z-Wave  ....

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 8823
Antw:$count-Variable bei set_Exec (DOIF-PerlModus)
« Antwort #1 am: 06 Juni 2021, 18:14:33 »
$count wird mit Null vorbelegt. Der Informatiker fängt ja bekanntlich bei 0 an zu zählen und nicht bei 1. In der Doku ist es auch so beschrieben.

Ein Kind ist ja bei der Geburt auch nicht gleich ein Jahr alt - hier als Vergleich.

Diese Vorgehensweise hat gewisse Vorteile bei der Multiplikation (z. B. am Anfang keine Verzögerung)
« Letzte Änderung: 06 Juni 2021, 18:17:51 von Damian »
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline Sany

  • Full Member
  • ***
  • Beiträge: 292
Antw:$count-Variable bei set_Exec (DOIF-PerlModus)
« Antwort #2 am: 06 Juni 2021, 18:56:13 »
Habe mir die Beipiele in der commandref nochmals angeschaut. Diese zählen alle hoch, da passt das so ganz wunderbar. Und für den Rückwärtszähler ziehe ich eben, wie in meinem Beispiel, einfach noch eine 1 mehr ab.

$count zählt quasi erst, wenn der Timer zum ersten mal abgelaufen ist, beginnend mit 0. Für meinen Countdown-Zähler war das halt einmal zu wenig.

Ist geklärt.

Vielen Dank!
fhem auf Zotac ZBox nano als LVM unter Proxmox, Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, ZigBee/deConz, Z-Wave  ....