Hallo,
Man kann in DOIF einfach relative Zeitangaben als Trigger verwenden z.B. [+:15] um etwas alle 15min zu tun.
Aber wie kann man das um z.B. 1min verschieben?
Die Funktion sollte also um 01, 16, 31, 46 getriggert werden.
Geht das auch?
Danke im Voraus
Lg, Gerhard
ja, du kannst mit Zeitangaben im DOIF rechnen: https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung
daher:
[([+:15]+[00:01])]
Mal wieder ums Eck gedacht.
Ist aber irgendwie logisch.
Vielen Dank für die Lösung!
Lg, Gerhard
Hallo,
habe das nun in mein DOIF eingebaut.
sub CalculateQuarterSums { [([+:15]+[00:01])];
set_Reading("last_quarter_sum",[?#sum:"^$SELF$":"last_quarter$"]);
}
sub CalculateHourSums { [([+:00]+[00:01])];
set_Reading("last_hour_sum",[?#sum:"^$SELF$":"last_hour$"]);
}
Aber es scheint nicht ganz zu funktionieren.
Der Trigger für z.B. wird nur einmal pro Stunde um x:16 ausgeführt, aber nicht um x:31, x:46 und scheinbar auch nicht um x:01.
Verliert DOIF irgendwie das "+"?
Bei der Variante zur vollen Stunde weiß ich es noch nicht.
Wahrscheinlich erst um Mitternacht, aberr ich habe das erst seit heute Früh am Laufen.
lg, Gerhard
Trigger funktionieren nur in DOIF-Blöcken, das Wort sub ist hier zu viel. So dürften bei dir gar keine Timer gesetzt worden sein.
Ich habe versucht, das in meinem DOIF einzubauen.
Aber es klappt nicht.
Anscheinend werden die Timer gesetzt, die Funktion wird aber nicht getriggert bzw. aufgerufen.
DEF TPL_stat (midnight_$1_$2 { [00:00:05];
set_Reading("$1_$2_counter",[?$1:$2]);
set_Reading("$1_$2_last_day",get_Reading("$1_$2_day",0),1);
set_Reading("$1_$2_day",0,1);
set_Reading("$1_$2_month",get_Reading("$1_$2_month",0)+get_Reading("$1_$2_last_day",0),1);
if ($mday == 1) {
set_Reading("$1_$2_last_month",get_Reading("$1_$2_month",0),1);
set_Reading("$1_$2_month",0,1);
set_Reading("$1_$2_year",get_Reading("$1_$2_year",0)+get_Reading("$1_$2_last_month",0),1);
}
if ($yday == 1) {
set_Reading("$1_$2_last_year",get_Reading("$1_$2_year",0),1);
set_Reading("$1_$2_year",0,1);
}
}
hour_$1_$2 { [:00];
set_Reading("$1_$2_hour_counter",[?$1:$2]);
set_Reading("$1_$2_last_hour",get_Reading("$1_$2_hour",0),1);
set_Reading("$1_$2_hour",0);
}
quarter_$1_$2 { [+:15];
set_Reading("$1_$2_quarter_counter",[?$1:$2]);
set_Reading("$1_$2_last_quarter",get_Reading("$1_$2_quarter",0),1);
set_Reading("$1_$2_quarter",0);
}
update_counters_$1_$2 {
## Log 1, "update_counters_$1_$2: [?$1:$2];".get_Reading("$1_$2_counter",0).";".get_Reading("$1_$2_hour_counter",0).";".get_Reading("$1_$2_quarter_counter",0);
set_Reading("$1_$2_day",int(([$1:$2,0]-get_Reading("$1_$2_counter",0))*1000)/1000,1);
set_Reading("$1_$2_hour",int(([$1:$2,0]-get_Reading("$1_$2_hour_counter",0))),1);
set_Reading("$1_$2_quarter",int(([$1:$2,0]-get_Reading("$1_$2_quarter_counter",0))),1);
}
init_$1_$2 {
if (!get_Reading("$1_$2_counter","")) {
set_Reading("$1_$2_quarter_counter",[?$1:$2]);
set_Reading("$1_$2_hour_counter",[?$1:$2]);
set_Reading("$1_$2_counter",[?$1:$2]);
set_Reading ("$1_$2_quarter",0);
set_Reading ("$1_$2_hour",0);
set_Reading ("$1_$2_day",0);
set_Reading ("$1_$2_month",0);
set_Reading ("$1_$2_year",0);
set_Reading ("$1_$2_last_quarter",0);
set_Reading ("$1_$2_last_hour",0);
set_Reading ("$1_$2_last_day",0);
set_Reading ("$1_$2_last_month",0);
set_Reading ("$1_$2_last_year",0);
set_Reading ("sum_last_quarter",0);
set_Reading ("sum_last_hour",0);
set_Reading ("sum_last_day",0);
}
}
)
##https://forum.fhem.de/index.php/topic,84969.msg1208710.html#msg1208710
CalculateQuarterSums { [([+:15]+[00:01])];
set_Reading("last_quarter_sum",[?#sum:"^$SELF$":"last_quarter$"]);
}
CalculateHourSums { [([+:00]+[00:01])];
set_Reading("last_hour_sum",[?#sum:"^$SELF$":"last_hour$"]);
}
FOR(::devspec2array("MQTT2_shelly.*:FILTER=group=Haushaltsgeräte"), TPL_stat ($_,energy_total))
Die Timer werden anscheinend richtig gesetzt (zumindest gibt es readings "timer_x_cy" mit den richtigen Werten.
lg, Gehard
Ich sehe gerade, dass im folgenden Reading des DOIF steht, dass die Funktion "CalculateQuarterSums" zur korrekten Zeit aufgerufen wurde:
block_CalculateQuarterSums executed 2022-02-17 12:46:00
Eigentlich eh sehr informativ, wenn man die Zusammenhänge versteht ;)
Dann funktioniert es, aber die Summenbildung klappt so (noch) nicht.
Und "CalculateHourSums" wird nicht aufgerufen.
Es gibt auch kein "block_CalculateHourSums"-reading.
lg, Gerhard
Beim mir funktioniert alles mit deinem Code:
Du hast nur die falschen Readings initialisiert:
Es muss heißen:
set_Reading ("last_quarter_sum",0);
set_Reading ("last_hour_sum",0);
set_Reading ("last_day_sum",0);
Eigenartig.
Bei mir klappt das mit der vollen Stunde nicht.
Das "[([+:00]+[00:01])]" kann doch nicht stimmen.
Wäre es nicht besser [:01] zu schreiben?
lg, Gerhard
Meine Aussage bezog sich vielmehr auf die Berechnung der Summen:
ZitatDann funktioniert es, aber die Summenbildung klappt so (noch) nicht.
Und "CalculateHourSums" wird nicht aufgerufen.
Es gibt auch kein "block_CalculateHourSums"-reading.
Für volle Stunde musst du
[:00] angeben.