[gelöst] Relative Zeitangabe an Raster ausrichten?

Begonnen von gestein, 16 Februar 2022, 23:57:40

Vorheriges Thema - Nächstes Thema

gestein

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

Damian

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

gestein

Mal wieder ums Eck gedacht.
Ist aber irgendwie logisch.
Vielen Dank für die Lösung!

Lg, Gerhard

gestein

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

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

gestein

#6
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


Damian

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);
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF